Macros 球拍宏如何将椭圆传递给辅助函数?
鉴于: 如何接收辅助对象中的图案和省略号?我甚至不确定包裹尸体是否。。。inside()是正确的,但我已经看过了,它是唯一不会崩溃的东西 process body过程以包含额外()的语法结束。我可以试着把它拆开,但我只是想知道正确的方法是什么 processbody在body模式之前和之后使用一些代码进行包装。与define类似,我希望能够为宏提供多个表单,而不是一个列表中的所有表单。所以,如果给定(form1)(form2),其中form2是省略号,进程体应该(做某事)(form1)(form2)(做其他事情) 即 当然,当我在线定义模板时,我可以做到这一点,我想我可以在这里做到,但是有时候模板会变得很笨拙,调用助手也很好 非常感谢 作为尝试dyoo的第一个示例的编辑,我提供以下内容:Macros 球拍宏如何将椭圆传递给辅助函数?,macros,racket,ellipsis,Macros,Racket,Ellipsis,鉴于: 如何接收辅助对象中的图案和省略号?我甚至不确定包裹尸体是否。。。inside()是正确的,但我已经看过了,它是唯一不会崩溃的东西 process body过程以包含额外()的语法结束。我可以试着把它拆开,但我只是想知道正确的方法是什么 processbody在body模式之前和之后使用一些代码进行包装。与define类似,我希望能够为宏提供多个表单,而不是一个列表中的所有表单。所以,如果给定(form1)(form2),其中form2是省略号,进程体应该(做某事)(form1)(form
(define-for-syntax (process-body body-syntax)
(with-syntax ([stx body-syntax])
(syntax/loc body-syntax
(λ (request)
stx))))
λ:糟糕的语法
语法为
的模式的左侧也可以有省略号,因此可以执行以下操作:
#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"))
基本思想是,如果processbody
返回转换后的body元素,那么我们就可以将它们与begin
一起引入
您的过程主体
定义也可以将与语法一起使用
与省略号一起使用。所以你可以这样做:
(define-syntax (test stx)
(syntax-case stx ()
[(_ body ...)
(with-syntax ([(body0 ...) (process-body #'(body ...))])
#'(begin body0 ...))]))
如果这是过程体
的定义,我们应该修改测试
,因为过程体
的结果形状现在是一个完整的lambda表达式,所以我们可以直接返回其结果:
(define-for-syntax (process-body bodies)
(with-syntax ([(body ...) bodies])
(syntax/loc bodies
(λ (request)
body ...))))
作为一个独立的示例:
(define-syntax (test stx)
(syntax-case stx ()
[(_ body ...)
(process-body (syntax/loc stx (body ...)))]))
如果processbody
打算使用一个语法列表,那么您可能可以执行类似的操作:(processbody(syntax->list#'(body…)
,使用语法->list
将语法对象分割为多个部分。不知道processbody
的更多信息,这个问题有点不清楚。你能添加更多细节吗?当然,我编辑过了。让我知道这是否有意义。我也尝试了(syntax->list),但不确定如何从帮助程序返回列表的cdr作为独立语法对象。如果我正确理解了问题:您能使用begin
进行拼接吗?我不熟悉这种拼接。所以,假设进程主体接收stx对象的列表。目前,它只接收一个语法对象,并将其作为(lambda()(something)stx obj(something other))返回。我想做的基本上是(应用begin stx列表),但这不起作用,起作用了。我没有意识到省略号可以用这样的语法进入赋值。我试图将其返回为body0,但随后它抱怨模板中没有省略号。除了,当包装在lambda中时,我得到lambda:bad语法。因此,如果流程主体是(请参见问题末尾的编辑)。这是因为传入时括号中包含了#’(body…),我认为基本上,最终的返回值是(lambda(lambda(request)((my proc))使用2个括号,因为原始语法是用parens包装的,以便作为一个arg传递到#'body中。不过我不确定,大脑开始卡住了;)没问题。请告诉我修改后的答案是否有用。还要注意Greg Hendershott的教程“害怕宏”。同样的问题,使用您的编辑。λ:语法错误。测试和处理主体形式与您的相同,只是(语法/loc主体语法现在替换为(语法/loc主体语法)
(define-syntax (test stx)
(syntax-case stx ()
[(_ body ...)
(process-body (syntax/loc stx (body ...)))]))
#lang racket
(define-syntax (test stx)
(syntax-case stx ()
[(_ body ...)
(process-body
(syntax/loc stx (body ...)))]))
(define-for-syntax (process-body bodies)
(with-syntax ([(body ...) bodies])
(syntax/loc bodies
(λ (request)
(printf "before the body\n")
body ...
(printf "after the body\n")))))
;; Let's try it:
(define p
(test (displayln "hello") (displayln "world")))
(p 'should-be-a-request)