我正在尝试创建一个简单的嵌套宏。它适用于我的 Scheme 实现,但无法在 Guile 和 Racket 中运行。
(define-syntax foo
(syntax-rules (:c)
((_ x ...)
(let-syntax ((bar (syntax-rules ::: (:c)
((_ x)
(print x))
((_ a b :::)
(begin
(display a)
(display " ")
(bar b :::))))))
(bar x ...)))))
- 诡计投掷:
语法:缺少省略号
- 球拍投掷:
模板中缺少带有模式变量的省略号
我也尝试过在 Gambit 中运行,但那个只是抛出:
未绑定变量:define-syntax
我想您需要使用库来使用基本方案。
在 Checken Scheme 中,更新省略号后:
(define-syntax foo
(syntax-rules (:c)
((_ x ...)
(let-syntax ((bar (syntax-rules <:::> (:c)
((_ x)
(print x))
((_ a b <:::>)
(begin
(display a)
(display " ")
(bar b <:::>))))))
(bar x ...)))))
抛出:
模板尺寸错误(椭圆太少?):x
这个宏有什么问题?为什么会抛出错误?
编辑:
似乎这种模式无效:
(_ x ...)
但这是
(_ x y ...)
这是在某处指定的吗?为什么第一个语法无效?
为了完整起见,这段代码可以编译,但为什么第一个没有呢?
(define-syntax foo
(syntax-rules ()
((_ x y ...)
(let-syntax ((bar (syntax-rules <:::> ()
((_ x)
(print x))
((_ a b <:::>)
(begin
(display a)
(display " ")
(bar b <:::>))))))
(bar x y ...)))))
foo
但是当尝试使用宏时它不起作用。它抛出:
未绑定变量:bar
即使在使用letrec-syntax
.