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
<matth...@felleisen.org> 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 
> <michaelmmacl...@gmail.com> 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 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.
>
>
> --
> 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/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 racket-users+unsubscr...@googlegroups.com.
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