首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >guile方案中的宏扩展

guile方案中的宏扩展
EN

Stack Overflow用户
提问于 2018-04-28 13:32:36
回答 2查看 490关注 0票数 3

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

代码位于guix/records.scm中

代码很大,而且清晰明了。

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

问题是,即使是标准的srfi-9记录也是结构周围的宏,它们本身也是这样。

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

我更愿意看到单次宏扩展的结果,看看guix宏生成了什么srfi-9代码

在Clojure中有macroexpandmacroexpand-1

macroexpand-1执行一次宏扩展,macroexpand重复调用macroexpand-1,直到在要处理的表单中不再有要扩展的macors

您可以看到这个here

Guile方案中有类似的选项吗?

我是否遗漏了任何工作流程技巧、任何工具、任何库函数或宏来处理此问题?

EN

回答 2

Stack Overflow用户

发布于 2018-05-25 02:27:06

下面是macroexpand1的一个简单版本

代码语言:javascript
复制
#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))

输出为:

代码语言:javascript
复制
'(let ((or-part 1)) (if or-part or-part (or 2 3)))

请注意,Clojure的宏展开算法比大多数Scheme实现中使用的算法更简单。

关于psyntax的解释,也就是可移植的语法案例,请参阅“漂亮的代码”一书中Dybvig的章节。

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

票数 3
EN

Stack Overflow用户

发布于 2018-04-28 16:09:40

好的,在新闻文件中有这样一段摘录

**删除了函数: PLT宏扩展-1‘和语法-macroexpand-1' It is unclear how to implement,尽管PLT Scheme确实证明了这是可能的。

我不知道宏扩展-1和语法-大小写之间有什么问题,我也不知道球拍对它做了什么。

但至少现在我知道宏扩展-1已经被显式地删除了

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50073207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档