在Guix中,有一个由宏组成的层,它美化了srfi-9记录的创建和操作
代码位于guix/records.scm中
代码很大,而且清晰明了。
我想通过扩展这些宏来查看它们的输入和输出,以便了解它们的作用。
问题是,即使是标准的srfi-9记录也是结构周围的宏,它们本身也是这样。
所以宏的扩展给了我一个完全扩展的代码来创建和操作结构。
我更愿意看到单次宏扩展的结果,看看guix宏生成了什么srfi-9代码
在Clojure中有macroexpand和macroexpand-1
macroexpand-1执行一次宏扩展,macroexpand重复调用macroexpand-1,直到在要处理的表单中不再有要扩展的macors
您可以看到这个here
Guile方案中有类似的选项吗?
我是否遗漏了任何工作流程技巧、任何工具、任何库函数或宏来处理此问题?
发布于 2018-05-25 02:27:06
下面是macroexpand1的一个简单版本
#lang racket
(define-syntax (expand1 stx)
(syntax-case stx ()
[(_expand1 form)
(syntax-case #'form ()
[(id . more)
(identifier? #'id)
(let ([transformer (syntax-local-value #'id)])
(with-syntax ([expansion (transformer #'form)])
#''expansion))]
[_
#''form])]))
(expand1 (or 1 2 3))输出为:
'(let ((or-part 1)) (if or-part or-part (or 2 3)))请注意,Clojure的宏展开算法比大多数Scheme实现中使用的算法更简单。
关于psyntax的解释,也就是可移植的语法案例,请参阅“漂亮的代码”一书中Dybvig的章节。
发布于 2018-04-28 16:09:40
好的,在新闻文件中有这样一段摘录
**删除了函数: PLT宏扩展-1‘和语法-
macroexpand-1' It is unclear how to implement,尽管PLT Scheme确实证明了这是可能的。
我不知道宏扩展-1和语法-大小写之间有什么问题,我也不知道球拍对它做了什么。
但至少现在我知道宏扩展-1已经被显式地删除了
https://stackoverflow.com/questions/50073207
复制相似问题