If `define-values` is not strictly required, here's a more
syntax-case-y recursive version:

(define-syntax (aux stx)
  (syntax-case stx ()
    [(_) #'(begin)]
    [(_ (var val) . rst)
     (identifier? #'var)
     #'(begin
         (define var val)
         (aux . rst))]
    [(_ var . rst)
     (identifier? #'var)
     #'(begin
         (define var #f)
         (aux . rst))]))

On Fri, May 24, 2019 at 9:33 AM Matthias Felleisen
<[email protected]> wrote:
>
>
> 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.

-- 
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/CAFfiA1%2BDYBrq_UutmwX5_sPatngCr%3DLkqFsczLxKn_rDBA%2BOrw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to