【发布时间】:2012-12-29 01:46:32
【问题描述】:
给定:
(define-syntax (test stx)
(syntax-case stx ()
[(_ body ...)
(with-syntax ([body0 (process-body #'(body ...))])
#'body0)]))
我应该如何接收助手中的模式和省略号?我什至不确定将 body ... 包裹在 () 内是否正确,但我已经看到它是唯一不会崩溃的东西。
process-body 过程以包含额外 () 的语法结束。我可以尝试将其分解,但我只是想知道正确的方法是什么。
process-body 用一些代码前后包裹了主体模式。而且,与定义类似,我希望能够为宏提供多种形式,而不是一个列表中的所有形式。因此,如果给定 (form1) (form2),其中 form2 是省略号,则流程主体应该 (do-something) (form1) (form2) (do-something-else)。
即,
(define-for-syntax (process-body body-syntax)
(with-syntax ([stx body-syntax])
(syntax/loc body-syntax
(λ (request)
stx))))
当然,当我定义内联模板时,我有这个工作,我想我可以在这里做,但有时模板变得笨拙,调用帮助器很好。
非常感谢。
作为尝试 dyoo 的第一个示例的编辑,我提供以下内容:
#lang racket
(define-syntax (test2 stx)
(syntax-case stx ()
[(_ body ...)
(with-syntax ([(body0 ...) (process-body2 #'(body ...))])
#'(begin body0 ...))]))
(define-for-syntax (process-body2 bodies)
(with-syntax ([(body ...) bodies])
(syntax/loc bodies
(λ (request)
body ...))))
(test2 (print "hi"))
λ:语法错误
【问题讨论】:
-
如果
process-body打算使用一个语法列表,那么您可能可以执行以下操作:(process-body (syntax->list #'(body ...))),使用syntax->list将语法对象分段。 -
不知道更多关于
process-body做什么的信息,这个问题有点不清楚。你能补充更多细节吗? -
当然,我编辑了它。让我知道这是否更有意义。我也尝试过(syntax->list),但不确定如何从帮助程序中将列表的 cdr 作为独立语法对象返回。
-
如果我理解正确的话:可以用
begin拼接吗? -
这是我不熟悉的拼接。因此,假设 process-body 接收到一个 stx-objects 列表。目前,它只接收一个语法对象并将其作为 (lambda () (something) stx-obj (something-else)) 返回。我想做的基本上是(应用开始stx列表),但这不起作用