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.

Reply via email to