在Guix中,有一个由宏构成的层,用于美化srfi-9记录的创建和操作
代码在guix / records.scm
中代码很大且清晰可见
我想扩展这些宏以查看他们的输入和输出,以便了解他们的工作
事情是,即使是标准的香草srfi-9记录也是结构周围的宏,依次是
因此宏扩展为我提供了一个完全扩展的代码来创建和操作结构。
我更希望看到一次宏扩展的结果,看看guix宏产生了什么srfi-9代码
在Clojure中有macroexpand
和macroexpand-1
macroexpand-1
只进行一次宏扩展,并macroexpand
重复调用macroexpand-1
,直到在正在处理的表单中不再有宏扩展
您可以看到此here
Guile计划中是否有类似的选项?
我是否遗漏了任何工作流技巧,任何工具,任何库函数或用于处理此问题的宏?
答案 0 :(得分:3)
以下是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章节“Beautiful Code”一书。
答案 1 :(得分:2)
好的,在NEWS文件中有这个摘录
**删除了函数:`macroexpand-1'
目前还不清楚如何实现`macroexpand-1'语法大小写 虽然PLT计划确实证明了这一点。
我不喜欢'知道macroexpand-1和syntax-case之间的问题是什么,我不知道Racket正在做些什么
但至少现在我知道macroexpand-1已被明确删除