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.