Another "syntax-case-y" version generates `define-values`:
(define-syntax-rule (aux clause ...)
(aux-helper () (clause ...)))
(define-syntax (aux-helper stx)
(syntax-case stx ()
[(_ ([id val] ...) ())
#'(define-values (id ...) (values val ...))]
[(_ (id+val ...) ([id val] more ...))
(identifier? #'id)
#'(aux-helper (id+val ... [id val]) (more ...))]
[(_ (id+val ...) (id more ...))
(identifier? #'id)
#'(aux-helper (id+val ... [id #f]) (more ...))]))
在 2019年5月24日星期五 UTC+8下午12:41:20,lysseus写道:
>
> Hi guys,
> I’ve been wracking my brains all day trying to come up with a macro that
> would convert this syntax:
>
> ;; (aux a (b (* 2 pi)) c (d pi))
> ;; => (define-values (a b c d) (values #f 6.28318530717958 #f
> 3.141592653589793)
>
>
> I’m missing some part of the picture. The closest I’ve come is to create a
> list of the pairs:
>
> #lang racket
>
> (define-syntax (aux stx)
> (syntax-case stx ()
> [(_ (var val)) #'`((var ,val))]
> [(_ var) #''((var #f))]
> [(_ (var0 val0) var1 ...) #'(append `((var0 ,val0)) (aux var1 ...))]
> [(_ var0 var1 ...) #'(append '((var0 #f)) (aux var1 ...))]))
>
> (aux a (b (* 2 pi)) c (d pi)) ;=> '((a #f) (b 6.283185307179586) (c #f) (d
> 3.141592653589793))
>
>
> Any help is greatly appreciated!
>
> Kevin
--
You received this message because you are subscribed to the Google Groups
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/racket-users/38e8096f-0831-43be-879c-86fb9252004f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.