gpt4 book ai didi

macros - 通过嵌套宏中的省略号捕获可变数量的参数;缺少模式变量错误

转载 作者:行者123 更新时间:2023-12-04 16:58:42 24 4
gpt4 key购买 nike

考虑两个宏的情况:outer-macro定义某个实体的一般结构,并且inner-macro在外部宏的范围内扩展。以下代码捕获了我的意图,其中预期的输出是打印语句。本示例对内部宏的模式抛出以下错误:(_ value ...)

syntax: no pattern variables before ellipsis in template in: ...

我打算以与外部宏的 value ...模式相同的方式使用 body ...。实际上,“值”列表正是我所需要的(不一定是非常灵活的“省略号模式”)。遗憾的是,这种方式无法正常工作。如何捕获内部宏中可变数量的参数?
#lang racket

(require
racket/stxparam
(for-syntax syntax/parse))

(define-syntax-parameter inner-macro
(lambda (stx)
(raise-syntax-error 'inner-macro "generic error message" stx)))

(define-syntax (outter-macro stx)
(syntax-parse stx
[(_ body:expr ...+)
#'(syntax-parameterize
([inner-macro
(lambda (stx)
(syntax-case stx ()
[(_ value ...)
(printf "values are: ~a~n" (list value ...))]))])
body ...)]))

(outter-macro
(inner-macro 'a 'b 'c))

; expected result
; > "values are: (a b c)"

最佳答案

要“逃避”语法模板中的省略号,可以使用语法(... <form>),其中<form>是语法模板,在其中按字面意义处理...序列。因此,您可以包装一段语法以包括文字省略号:

> #'(... (syntax-rules ()
[(x ...) (list x ...)]))
#<syntax:4:9 (syntax-rules () ((x ...) (li...>

您可以使用它来包围内部宏定义以转义内部椭圆:
(define-syntax (outer-macro stx)
(syntax-parse stx
[(_ body:expr ...+)
#'(syntax-parameterize
([inner-macro
(lambda (stx)
(... (syntax-case stx ()
[(_ value ...)
(printf "values are: ~a~n" (list value ...))])))])
body ...)]))

但是,这实际上并不完全正确,因为您的 syntax-case正文是错误的-它不返回语法对象。您只是在 #'之前缺少了 (printf ...)(或者可以使用 syntax-rules),因此正确的实现应为以下内容:
(define-syntax (outer-macro stx)
(syntax-parse stx
[(_ body:expr ...+)
#'(syntax-parameterize
([inner-macro
(lambda (stx)
(... (syntax-case stx ()
[(_ value ...)
#'(printf "values are: ~a~n" (list value ...))])))])
body ...)]))

这应该按预期工作。

关于macros - 通过嵌套宏中的省略号捕获可变数量的参数;缺少模式变量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38275779/

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