3

在 Guix 中有一个由宏组成的层美化了 srfi-9 记录的创建和操作

代码在 guix/records.scm

代码大且清晰

我想扩展这些宏以查看它们的输入和输出,以便了解它们的作用

问题是,即使是标准的 vanilla srfi-9 记录也是围绕结构的宏,轮到它们自己

所以宏扩展给了我一个完全扩展的代码创建和操作结构。

我更希望看到单遍宏扩展的结果,看看 guix 宏产生了什么 srfi-9 代码

在 Clojure 中有macroexpandmacroexpand-1

macroexpand-1执行一次宏扩展并重复macroexpand调用macroexpand-1,直到正在处理的表单中没有更多宏可以扩展

你可以在这里看到这个

Guile 计划中是否有类似的选项?

我是否缺少任何工作流程技巧、任何工具、任何库函数或宏来处理这个问题?

4

2 回答 2

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”一书。

https://www.cs.indiana.edu/~dyb/pubs/bc-syntax-case.pdf

于 2018-05-24T18:27:05.800 回答
2

好的,在 NEWS 文件中有这段摘录

** 删除函数:`macroexpand-1'

目前还不清楚如何使用 syntax-case 实现“macroexpand-1”,尽管 PLT Scheme 确实证明了它是可能的。

我不知道macroexpand-1 和syntax-case 之间的问题是什么,我不知道Racket 对此做了什么

但至少现在我知道 macroexpand-1 已被明确删除

于 2018-04-28T08:09:40.083 回答