Skip to main content
Code Review

Return to Question

replaced http://stackoverflow.com/ with https://stackoverflow.com/
Source Link

I'm a complete noob at using define-sequence-syntax, so I appreciate any and all style, performance, and/or general feedback about my code. (See the original post the original post for some usage examples.)

I'm a complete noob at using define-sequence-syntax, so I appreciate any and all style, performance, and/or general feedback about my code. (See the original post for some usage examples.)

I'm a complete noob at using define-sequence-syntax, so I appreciate any and all style, performance, and/or general feedback about my code. (See the original post for some usage examples.)

replaced http://codereview.stackexchange.com/ with https://codereview.stackexchange.com/
Source Link

Recently, soegaard soegaard challenged me to write a define-sequence-syntax version of in-nest-sequence, that is, a macro-based version. I decided to give it a try:

Recently, soegaard challenged me to write a define-sequence-syntax version of in-nest-sequence, that is, a macro-based version. I decided to give it a try:

Recently, soegaard challenged me to write a define-sequence-syntax version of in-nest-sequence, that is, a macro-based version. I decided to give it a try:

Update the code to implement all of soegaard's suggestions.
Source Link
C. K. Young
  • 2.4k
  • 17
  • 23

in-iteratenest-sequence: sequence generator in Racket

in-iteratenest-sequence is a sequence generator that takes a function and an initial value, and the return value of invoking the function on the current value is used as the subsequent value. For example, (in-iteratenest-sequence add1 0) returns the sequence (0 1 2 3 4 ...).

Recently, soegaard challenged me to write a define-sequence-syntax version of in-iteratenest-sequence, that is, a macro-based version. I decided to give it a try:

#lang racket
(require (for-syntax unstable/syntax))
(provide (rename-out [*in-iteratenest-sequence in-iterate]nest-sequence]))
(define in-iteratenest-sequence
 (case-lambda
 [(func init)
 (make-do-sequence
 (thunk (values identity func init #f #f #f)))]
 [(func . inits)
 (make-do-sequence
 (thunk (values (curry apply values)
 (lambda (args)
 (call-with-values (thunk (apply func args)) list))
 inits #f #f #f)))]))
(define-sequence-syntax *in-iteratenest-sequence
 (lambda () #'in-iteratenest-sequence)
 (lambda (stx)
 (syntax-case stx ()
 [[(x ...) (_ func init ...)]
 #'[(x)unless (:do-in= ([syntax-length #'(f)x func]...)
 #f
 ) (syntax-length #'([valueinit init]...)))
 (raise-syntax-error 'in-nest-sequence
 #t
 (format "~a values required" ([syntax-length #'(x) value]...)))
 #t
  stx #'(init #t...)))
 (with-syntax ([for-arity (syntax-length #'(finit value)...))]]]
 [[(x ...) (_ func init ...)]
 (with-syntax ([(value ...) (generate-temporaries #'(init ...))]
 [(y ...) (generate-temporaries #'(init ...))])
 #'[(x ...) (:do-in ([(f) func])
 #f(unless (procedure-arity-includes? f for-arity)
 (raise-arity-error f (procedure-arity f) init ...))
 ([value init] ...)
 #t
 ([(x ...) (values value ...)]
 [(y ...) (f value ...)])
 #t
 #t
 (y ...))])])))

in-iterate: sequence generator in Racket

in-iterate is a sequence generator that takes a function and an initial value, and the return value of invoking the function on the current value is used as the subsequent value. For example, (in-iterate add1 0) returns the sequence (0 1 2 3 4 ...).

Recently, soegaard challenged me to write a define-sequence-syntax version of in-iterate, that is, a macro-based version. I decided to give it a try:

#lang racket
(provide (rename-out [*in-iterate in-iterate]))
(define in-iterate
 (case-lambda
 [(func init)
 (make-do-sequence
 (thunk (values identity func init #f #f #f)))]
 [(func . inits)
 (make-do-sequence
 (thunk (values (curry apply values)
 (lambda (args)
 (call-with-values (thunk (apply func args)) list))
 inits #f #f #f)))]))
(define-sequence-syntax *in-iterate
 (lambda () #'in-iterate)
 (lambda (stx)
 (syntax-case stx ()
 [[(x) (_ func init)]
 #'[(x) (:do-in ([(f) func])
 #f
  ([value init])
 #t
 ([(x) value])
 #t
  #t
 ((f value)))]]
 [[(x ...) (_ func init ...)]
 (with-syntax ([(value ...) (generate-temporaries #'(init ...))]
 [(y ...) (generate-temporaries #'(init ...))])
 #'[(x ...) (:do-in ([(f) func])
 #f
 ([value init] ...)
 #t
 ([(x ...) (values value ...)]
 [(y ...) (f value ...)])
 #t
 #t
 (y ...))])])))

in-nest-sequence: sequence generator in Racket

in-nest-sequence is a sequence generator that takes a function and an initial value, and the return value of invoking the function on the current value is used as the subsequent value. For example, (in-nest-sequence add1 0) returns the sequence (0 1 2 3 4 ...).

Recently, soegaard challenged me to write a define-sequence-syntax version of in-nest-sequence, that is, a macro-based version. I decided to give it a try:

#lang racket
(require (for-syntax unstable/syntax))
(provide (rename-out [*in-nest-sequence in-nest-sequence]))
(define in-nest-sequence
 (case-lambda
 [(func init)
 (make-do-sequence
 (thunk (values identity func init #f #f #f)))]
 [(func . inits)
 (make-do-sequence
 (thunk (values (curry apply values)
 (lambda (args)
 (call-with-values (thunk (apply func args)) list))
 inits #f #f #f)))]))
(define-sequence-syntax *in-nest-sequence
 (lambda () #'in-nest-sequence)
 (lambda (stx)
 (syntax-case stx ()
 [[(x ...) (_ func init ...)]
 (unless (= (syntax-length #'(x ...)) (syntax-length #'(init ...)))
 (raise-syntax-error 'in-nest-sequence
 (format "~a values required" (syntax-length #'(x ...)))
 stx #'(init ...)))
 (with-syntax ([for-arity (syntax-length #'(init ...))]
 [(value ...) (generate-temporaries #'(init ...))]
 [(y ...) (generate-temporaries #'(init ...))])
 #'[(x ...) (:do-in ([(f) func])
 (unless (procedure-arity-includes? f for-arity)
 (raise-arity-error f (procedure-arity f) init ...))
 ([value init] ...)
 #t
 ([(x ...) (values value ...)]
 [(y ...) (f value ...)])
 #t
 #t
 (y ...))])])))
improved title formatting
Link
Quill
  • 12k
  • 5
  • 41
  • 93
Loading
Source Link
C. K. Young
  • 2.4k
  • 17
  • 23
Loading
lang-lisp

AltStyle によって変換されたページ (->オリジナル) /