4

鉴于:

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

IE,

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

λ:语法错误

4

1 回答 1

4

图案的左侧with-syntax也可以有椭圆,因此可以进行以下操作:

(define-syntax (test stx)
  (syntax-case stx ()
    [(_ body ...)
     (with-syntax ([(body0 ...) (process-body #'(body ...))])
       #'(begin body0 ...))]))

基本思想是,如果process-body返回转换后的 body 元素,我们可以将它们全部与 a 一起引入begin


您的process-body定义也可以with-syntax与省略号一起使用。所以你可以做这样的事情:

(define-for-syntax (process-body bodies)
  (with-syntax ([(body ...) bodies])
    (syntax/loc bodies
      (λ (request)
         body ...))))

如果这是 的定义process-body,我们应该修改,test因为结果 fromprocess-body现在是一个完整的 lambda 表达式,所以我们可以直接返回它的结果:

(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)
于 2013-01-15T02:13:16.187 回答