Let me propose the use of syntax-parse as an alternative here. I think it 
clarifies the purpose of the maco. — Matthias


#lang racket

(require (for-syntax syntax/parse))

#; (aux a (b (* 2 pi)) c (d pi))
;; =>
#; (define-values (a b c d) (values #f 6.28318530717958 #f 3.141592653589793))


(begin-for-syntax
  (define-syntax-class optionally-initiliazed
    (pattern (lhs:id rhs:expr))
    (pattern lhs:id #:attr rhs #'#f)))

(define-syntax (aux stx)
  (syntax-parse stx
    [(_ p:optionally-initiliazed ...) #'(define-values (p.lhs ...) (values 
p.rhs ...))]))

(aux a (b (* 2 pi)) c (d pi))




> On May 24, 2019, at 12:52 AM, Michael Murdock MacLeod 
> <[email protected]> wrote:
> 
> 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 [email protected].
> 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.

-- 
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/A0B65B5E-0244-4E7C-89E5-24ED2CDF69EB%40felleisen.org.
For more options, visit https://groups.google.com/d/optout.

Reply via email to