【问题标题】:In guile scheme, how to share syntax between outer macro and inner macro?在 guile 方案中,如何在外部宏和内部宏之间共享语法?
【发布时间】:2020-11-21 16:05:54
【问题描述】:

在 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

有没有可能做我想做的事?

【问题讨论】:

    标签: macros scheme guile


    【解决方案1】:

    好的,所以我发现了如何做到这一点。我必须在 datum-&gt;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,我在手册中找不到任何解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-29
      • 2018-10-08
      • 2010-11-16
      • 1970-01-01
      • 2015-09-26
      • 2020-04-08
      • 2013-10-31
      • 1970-01-01
      相关资源
      最近更新 更多