[racket] datum<->syntax with same context, yet "unbound identifier"
I've been struggling to get something working. Jon and Asumu leant me
a hand on #racket. I learned some ways to use patterns instead of
resorting to datum->syntax, which I can use in the future. But for
what I'm doing now (I need to sort arguments for a lambda) I don't see
any way around running things through syntax->datum and datum->syntax.
However I seem to be fudging lexical context.
The original is using syntax-parse to chunk up arg specs and so on.
But, here is a greatly-distilled version:
#lang racket
(require (for-syntax racket/list))
(define-syntax (lam stx)
(syntax-case stx ()
[(_ args body ...)
#`(lambda #,(datum->syntax #'args (append (syntax->datum #'args)))
body ...)]))
;; Use `lam'
(define f1
(lam (x y)
(list x y)))
(f1 1 0)
;; => '(1 0)
;; Good.
;; Now a variation:
(define-syntax (expand-to-lam stx)
(syntax-case stx ()
[(_ (name arg ...) body ...)
#'(lam (arg ...) body ...)]))
;; Use it
(expand-to-lam (f2 x y)
(list x y))
;; => x: unbound identifier in module
;; in: x
;; Huh?
Is there something else I should do instead, or is this possibly a bug?