Macros 在guile方案中,如何在外部宏和内部宏之间共享语法?
在Guile方案中,我有一个宏调用另一个宏,我希望对内部宏的调用引用内部宏中使用的符号。 下面是一个简单的例子来说明我想要实现的目标:Macros 在guile方案中,如何在外部宏和内部宏之间共享语法?,macros,scheme,guile,Macros,Scheme,Guile,在Guile方案中,我有一个宏调用另一个宏,我希望对内部宏的调用引用内部宏中使用的符号。 下面是一个简单的例子来说明我想要实现的目标: (define-syntax macro1 (lambda (x) (syntax-case x () ((macro1 expr1) (with-syntax ((f (datum->syntax x 'f))) #'(lambda (f) expr1)))))) (define-syntax
(define-syntax macro1
(lambda (x)
(syntax-case x ()
((macro1 expr1)
(with-syntax ((f (datum->syntax x 'f)))
#'(lambda (f) expr1))))))
(define-syntax macro2 (lambda (x)
(syntax-case x ()
((macro2 expr2)
#'(macro1 (expr2 f))))))
((macro2 1+) 2)
我希望最后一行返回3,但是我得到了以下错误:
;;; <stdin>:142:0: warning: possibly unbound variable `f'
ice-9/boot-9.scm:1669:16: In procedure raise-exception:
Unbound variable: f
;;:142:0:警告:可能未绑定变量'f'
ice-9/boot-9.scm:1669:16:过程中引发异常:
未绑定变量:f
可以做我想做的吗?好的,我想知道怎么做。我必须在
datum->syntax
调用中使用#宏1而不是x:
(define-syntax macro1
(lambda (x)
(syntax-case x ()
((macro1 expr1)
(with-syntax ((f (datum->syntax #'macro1 'f)))
#'(lambda (f) expr1))))))
(define-syntax macro2 (lambda (x)
(syntax-case x ()
((macro2 expr2)
#'(macro1 (expr2 f))))))
不确定为什么它不能与x一起工作,我在手册中找不到任何解释。好的,所以我发现了如何执行此操作。我必须在
datum->syntax
调用中使用#宏1而不是x:
(define-syntax macro1
(lambda (x)
(syntax-case x ()
((macro1 expr1)
(with-syntax ((f (datum->syntax #'macro1 'f)))
#'(lambda (f) expr1))))))
(define-syntax macro2 (lambda (x)
(syntax-case x ()
((macro2 expr2)
#'(macro1 (expr2 f))))))
不知道为什么它不能与x一起工作,我在手册中找不到任何解释