Hi Racketeers,
I’m creating a macro that collects values in the internal-definition
context. E.g.,
($list
1
(define x 2)
x)
should evaluate to '(1 2).
Here’s my implementation, and it kinda works:
#lang racket
(begin-for-syntax
(define ((do-it gs ctx) e)
(let loop ([e e])
(define e-expanded (local-expand e (list gs) #f ctx))
(syntax-case e-expanded (begin define-syntaxes define-values)
[(begin body ...)
#`(begin #,@(map loop (syntax->list #'(body ...))))]
[(define-values ids e)
(begin
(syntax-local-bind-syntaxes (syntax->list #'ids) #f ctx)
e-expanded)]
[(define-syntaxes ids e)
(begin
(syntax-local-bind-syntaxes (syntax->list #'ids) #'e ctx)
#'(begin))]
[e #'(set! acc (cons e acc))]))))
(define-syntax ($list stx)
(define gs (gensym))
(define ctx (syntax-local-make-definition-context))
(syntax-case stx ()
[(_ body ...)
#`(let ([acc '()])
#,@(map (do-it gs ctx) (syntax->list #'(body ...)))
(reverse acc))]))
($list 1
(define x 2)
x)
There are problems though. If I change define to define2 as follows:
(define-syntax-rule (define2 x y)
(define-values (x) y))
($list 1
(define2 x 2)
x)
Then I get the “identifier used out of context” error. This doesn’t make
sense to me at all. My define2 should be very similar to define…
There’s also another weird problem:
($list 1
(define-syntax (x stx) #'2)
x)
The above works perfectly, but by wrapping x with #%expression, I get the
“identifier used out of context” error again.
($list 1
(define-syntax (x stx) #'2)
(#%expression x))
What did I do wrong?
Thanks!
--
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/CADcuegtJKvcG0kMFp1k2yn8HfGTo5s7z2U2uW2fHF2qa1FQ5_g%40mail.gmail.com.