我正在尝试在 Scheme for Picolisp 样式let
表达式中编写一个宏,我们称之为宏let-slim
。为了更简洁(如 Picolisp),我希望它们的用法在仅声明一个变量时看起来像这样
(let-slim var-name initial-value
(display var-name))
或者像这样声明任意数量的变量(注意这是伪代码,我实际上不会包含省略号)
(let-slim (var-name-1 initital-value-1
var-name-2 initital-value-2
...
var-name-n initital-value-n)
(+ var-name-1 var-name-2 ... var-name-n))
第一个用例编写匹配模式相当简单syntax-rules
,但我正在努力解决后者。
这不起作用,因为只会init
重复
(define-syntax let-slim
(syntax-rules ()
[(_ (var init ...) body ...)
(let ((var init) ...)
body ... )]))
这不起作用,因为它被认为是错误的省略号
(define-syntax let-slim
(syntax-rules ()
[(_ (var ... init ...) body ...)
(let ((var init) ...)
body ... )]))
这不起作用,因为我需要在参考点使用括号(这意味着与内置的相比,它完全没有改变let
)
(define-syntax let-slim
(syntax-rules ()
[(_ (var init) ...) body ...)
(let ((var init) ...)
body ... )]))
那么,有没有一种方法可以重复 2 个变量syntax-rules
而无需将它们包装在括号中,还是我需要使用不同的宏系统(即syntax-case
或defmacro
)?