首页 > 解决方案 > 在 guile 方案中,如何在外部宏和内部宏之间共享语法?

问题描述

在 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

有可能做我想做的事吗?

标签: macrosschemeguile

解决方案


好的,所以我发现了如何做到这一点。我必须在datum->syntax调用中使用 #'macro1 而不是 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,我在手册中找不到任何解释。


推荐阅读