macros - 在 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
有可能做我想做的事吗?
解决方案
好的,所以我发现了如何做到这一点。我必须在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,我在手册中找不到任何解释。
推荐阅读
- javascript - Javascript 四舍五入
- windows-10 - Arris 端口转发
- amazon-web-services - AWS CLI describe-snapshots 以打印 SnapshotId
- java - java.io.FileNotFoundException 在 java 中获取文件的路径
- c# - 将类插入列表时如何触发一些代码
- python - 为什么 Python 中的 turtle 模块在尝试访问它时似乎有一个 screen 属性会导致属性错误?
- azure - pyodbc 是否支持使用 AD 访问令牌而不是用户/密码连接到 Azure SQL DB?
- python - 这两种为 sklearn GPR 指定训练/测试数据的方式有什么区别
- python - 计算每个国家的某个值
- java - 请求 http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.4.1/maven-clean-plugin-2.4.1.pom 错误