Macros 球拍宏如何将椭圆传递给辅助函数?

Macros 球拍宏如何将椭圆传递给辅助函数?,macros,racket,ellipsis,Macros,Racket,Ellipsis,鉴于: 如何接收辅助对象中的图案和省略号?我甚至不确定包裹尸体是否。。。inside()是正确的,但我已经看过了,它是唯一不会崩溃的东西 process body过程以包含额外()的语法结束。我可以试着把它拆开,但我只是想知道正确的方法是什么 processbody在body模式之前和之后使用一些代码进行包装。与define类似,我希望能够为宏提供多个表单,而不是一个列表中的所有表单。所以,如果给定(form1)(form2),其中form2是省略号,进程体应该(做某事)(form1)(form

鉴于:

如何接收辅助对象中的图案和省略号?我甚至不确定包裹尸体是否。。。inside()是正确的,但我已经看过了,它是唯一不会崩溃的东西

process body过程以包含额外()的语法结束。我可以试着把它拆开,但我只是想知道正确的方法是什么

processbody在body模式之前和之后使用一些代码进行包装。与define类似,我希望能够为宏提供多个表单,而不是一个列表中的所有表单。所以,如果给定(form1)(form2),其中form2是省略号,进程体应该(做某事)(form1)(form2)(做其他事情)

当然,当我在线定义模板时,我可以做到这一点,我想我可以在这里做到,但是有时候模板会变得很笨拙,调用助手也很好

非常感谢

作为尝试dyoo的第一个示例的编辑,我提供以下内容:

(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)