首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >球拍巨无霸制作对

球拍巨无霸制作对
EN

Stack Overflow用户
提问于 2012-03-25 13:48:38
回答 2查看 437关注 0票数 3

我刚开始钻研球拍宏,我试着做一个简洁的、简单的、宏观定义的宏。我想扩展一个这样的表达式:

代码语言:javascript
复制
(macro id
    (param) replacement1
    (params ...) replacement2)

变成这样的东西:

代码语言:javascript
复制
(define-syntax id
    (syntax-rules ()
        ((id param) replacement1)
        ((id params ...) replacement2)))

因此,将原始表达式的cddr转换为成对表达式(用于语法-规则正文),并将id插入到这些对的car中。

当只使用语法规则提供的模式匹配时,我很难递归地思考(我一直希望像正常列表一样操纵表达式)。我应该用什么样的图案?或者,我是否可以把它作为一个正常的列表来操作,然后取消引用结果,以便在扩展中使用?

非常感谢

编辑-试探性解决方案,由泰蒙的答案告知

我在这里的好奇之处之一就是要去掉那些括号。我研究了语法大小写,但有点困惑,所以我试着完全用模式匹配的子语言来做。最后,我使用Taymon的宏与另一个宏结合使用给定的模板(它的作用有点像一个累加器函数):

代码语言:javascript
复制
(define-syntax-rule (macro-aux id ((param ...) expr) ...)
  (define-syntax id
    (syntax-rules ()
      ((id param ...) expr)
      ...)))

(define-syntax pairize
  (syntax-rules ()
   ((pairize id (pairs ...) p b) (macro-aux id pairs ... (p b)))
   ((pairize id (pairs ...) p b rest ...) (pairize id (pairs ... (p b)) rest ...))))

(define-syntax macro
  (syntax-rules ()
    ((macro id tpl-expr ...) (pairize id () tpl-expr ...))))
EN

回答 2

Stack Overflow用户

发布于 2012-03-25 14:24:15

可以构建一个宏扩展程序,它将语法表达式作为常规的Racket数据进行操作。然而,在这种情况下,这并不是必要的。

我建议的一件事是稍微修改语法,以便每个模式替换对都包含在括号中。如下所示:

代码语言:javascript
复制
(macro id
  [(param) replacement1]
  [(params ...) replacement2])

一旦完成,您就可以使用一个常规的模式匹配宏。以下是我的看法:

代码语言:javascript
复制
(define-syntax-rule (macro id [(param ...) replacement] ...)
  (define-syntax id
    (syntax-rules ()
      [(id param ...) replacement] ...)))
票数 7
EN

Stack Overflow用户

发布于 2015-11-05 03:30:11

Taymon是对的,但是它也可以用省略号来实现,而不需要将模式替换对封装在括号中,使用来自syntax/parsesyntax/parse

代码语言:javascript
复制
(require syntax/parse/define)
(define-simple-macro (macro id (~seq (param ...) replacement) ...)
  (define-syntax id
    (syntax-rules ()
      [(id param ...) replacement] ...)))

它可以像你最初希望的那样使用:

代码语言:javascript
复制
(macro id
  (param) replacement1
  (params ...) replacement2)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9860634

复制
相关文章

相似问题

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