诡计的宏观扩张

时间:2018-04-28 05:32:36

标签: macros scheme guile guix

在Guix中,有一个由宏构成的层,用于美化srfi-9记录的创建和操作

代码在guix / records.scm

代码很大且清晰可见

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

事情是,即使是标准的香草srfi-9记录也是结构周围的宏,依次是

因此宏扩展为我提供了一个完全扩展的代码来创建和操作结构。

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

在Clojure中有macroexpandmacroexpand-1

macroexpand-1只进行一次宏扩展,并macroexpand重复调用macroexpand-1,直到在正在处理的表单中不再有宏扩展

您可以看到此here

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

我是否遗漏了任何工作流技巧,任何工具,任何库函数或用于处理此问题的宏?

2 个答案:

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

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

答案 1 :(得分:2)

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

  

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

     

目前还不清楚如何实现`macroexpand-1'语法大小写   虽然PLT计划确实证明了这一点。

我不喜欢'知道macroexpand-1和syntax-case之间的问题是什么,我不知道Racket正在做些什么

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