Macros 在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

在Guile方案中,我有一个宏调用另一个宏,我希望对内部宏的调用引用内部宏中使用的符号。 下面是一个简单的例子来说明我想要实现的目标:

(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一起工作,我在手册中找不到任何解释