【问题标题】:macro expansion in guile schemeGuile 方案中的宏扩展
【发布时间】:2018-10-08 22:29:24
【问题描述】:

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

代码在guix/records.scm中

代码大而清晰

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

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

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

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

在 Clojure 中有 macroexpandmacroexpand-1

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

你可以看到这个here

Guile 方案中是否有类似的选项?

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

【问题讨论】:

    标签: macros scheme guile guix


    【解决方案1】:

    这是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

    【讨论】:

      【解决方案2】:

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

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

      目前还不清楚如何使用语法大小写实现 `macroexpand-1', 虽然 PLT Scheme 确实证明了这是可能的。

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

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

      【讨论】:

        猜你喜欢
        • 2016-11-29
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        • 2020-11-21
        • 2020-04-08
        • 1970-01-01
        • 2017-10-13
        • 2020-09-10
        相关资源
        最近更新 更多