Does this work? It uses a helper function, `prune`, to parse the var-val clauses.
#lang racket (define-for-syntax (prune stx) (syntax-case stx () [() #'()] [((var val) others ...) (cons #'(var val) (prune #'(others ...)))] [(var others ...) (cons #'(var #f) (prune #'(others ...)))])) (define-syntax (aux stx) (syntax-case stx () [(_ terms ...) (with-syntax ([((var val) ...) (prune #'(terms ...))]) #'(define-values (var ...) (values val ...)))])) (aux a (b (* 2 pi)) c (d pi)) a b c d ;; output shown below #f 6.283185307179586 #f 3.141592653589793 On Thursday, May 23, 2019 9:41:17 PM PDT Kevin Forchione wrote: > 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 racket-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/2893163.LJ05K77S5N%40alphtsr. For more options, visit https://groups.google.com/d/optout.