gpt4 book ai didi

macros - Racket Macro 如何将省略号传递给 Helper 函数?

转载 作者:行者123 更新时间:2023-12-01 01:12:47 26 4
gpt4 key购买 nike

鉴于:

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

我应该如何接收助手中的模式和省略号?我什至不确定将 body ... inside () 包裹起来是否正确,但我已经看到了它并且它是唯一不会崩溃的东西。

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

λ: bad syntax

最佳答案

with-syntax 的左侧模式也可以有省略号,所以以下是可能的:

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

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

您的 process-body定义也可以用 with-syntax也有椭圆。所以你可以做这样的事情:
(define-for-syntax (process-body bodies)
(with-syntax ([(body ...) bodies])
(syntax/loc bodies
(λ (request)
body ...))))

如果这是 process-body的定义,我们应该修改 test因为来自 process-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)

关于macros - Racket Macro 如何将省略号传递给 Helper 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14329644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com