Hi Racketeers,

I’m creating a macro that collects values in the internal-definition
context. E.g.,

 (define x 2)

should evaluate to '(1 2).

Here’s my implementation, and it kinda works:

#lang racket

  (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)
           (syntax-local-bind-syntaxes (syntax->list #'ids) #f ctx)
        [(define-syntaxes ids e)
           (syntax-local-bind-syntaxes (syntax->list #'ids) #'e ctx)
        [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)

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)

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)

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?


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 

Reply via email to