为什么符号pat ...表示方案宏模式中的零个或多个表达式

时间:2013-09-19 12:47:37

标签: macros lisp scheme

当我正在阅读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)]))

我已经在某些情况下对此定义进行了测试,但我没有发现任何问题。

1 个答案:

答案 0 :(得分:3)

根据R6RS...必须始终遵循某个标识符才能获得“零或更多”含义(其行为类似于Kleene star),因此...和{{ 1}}表示不同的事情:就pat ...而言,前者只是一个文字...符号。

在您的示例中,两个表单看起来都是相同的,但这是因为模式syntax-rules仅在有两个或更多个联合((_ e1 e2 ...)的参数)时才会触发,因为第二个模式{ {1}}已经处理了只有一个合取的情况。它并不总是这样,Dybvig显然发现写一个明确的“两个或更多”条款而不是“一个”和“一个或多个”条款更清晰。