当我正在阅读the macro part of The Scheme Programming Language时,它提到当您尝试使用define-syntax
定义语法扩展时,应该使用pat ...
在模式中指定零个或多个表达式。为什么不将...
用于零或更多表达式,在这种情况下pat ...
表示一个或多个表达式?
此外,当作者给出and
的定义如下:
(define-syntax and
(syntax-rules ()
[(_) #t]
[(_ e) e]
[(_ e1 e2 e3 ...)
(if e1 (and e2 e3 ...) #f)]))
为什么不这样写:
(define-syntax and
(syntax-rules ()
[(_) #t]
[(_ e) e]
[(_ e1 e2 ...)
(if e1 (and e2 ...) #f)]))
我已经在某些情况下对此定义进行了测试,但我没有发现任何问题。
答案 0 :(得分:3)
根据R6RS,...
必须始终遵循某个标识符才能获得“零或更多”含义(其行为类似于Kleene star),因此...
和{{ 1}}表示不同的事情:就pat ...
而言,前者只是一个文字...
符号。
在您的示例中,两个表单看起来都是相同的,但这是因为模式syntax-rules
仅在有两个或更多个联合((_ e1 e2 ...)
的参数)时才会触发,因为第二个模式{ {1}}已经处理了只有一个合取的情况。它并不总是这样,Dybvig显然发现写一个明确的“两个或更多”条款而不是“一个”和“一个或多个”条款更清晰。