在Gambit方案中,如果我编译文件,我似乎无法在另一个宏的定义中调用宏。这是一个人为的例子:宏调用宏在Gambit方案中给出了“未定义变量”
;;;; example.scm
(define-macro (w/gensyms gs body)
`(let ,(map (lambda (g) `(,g (gensym ',g)))
gs)
,body))
(define-macro (compose-macro f g)
(w/gensyms (x)
`(lambda (,x) (,f (,g ,x)))))
(define my-cadr
(lambda (x)
((compose-macro car cdr) x)))
;; $ gsc example.scm
;; *** ERROR IN #<procedure #2> -- Unbound variable: w/gensyms
但是,如果我加载与(include ...)
特殊形式的文件中解释,它的工作原理
$ gsi
> (include "example.scm")
> (pp my-cadr)
(lambda (x) ((lambda (#:x0) (car (cdr #:x0))) x))
有谁知道这是怎么回事?我能否说服Gambit让我在编译的文件中定义另一个宏时使用w/gensyms?
我知道我不应该使用定义宏 – scpayson