代码之家  ›  专栏  ›  技术社区  ›  Wei Li

为什么记谱拍。。。表示scheme宏模式中的零个或多个表达式

  •  2
  • Wei Li  · 技术社区  · 13 年前

    当我读书的时候 the macro part of The Scheme Programming Language ,它提到当您试图使用定义语法扩展时 define-syntax ,您应该使用 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 回复  |  直到 13 年前
        1
  •  3
  •   Fred Foo    13 年前

    每 R6RS , ... 必须始终跟在某个标识符后面才能获得其“零或更多”的含义(其行为类似 Kleene star ),所以 ... 和 pat ... 意思不同:前者只是字面意思 ... 符号远至 syntax-rules 令人担忧。

    在您的示例中,两种形式似乎是相同的,但这是因为 (_ e1 e2 ...) 只有当有两个或两个以上的连词(对 and )无论如何,由于第二种模式 (_ e) 已经处理了只有一个连词的情况。它并不总是这样工作的,Dybvig显然发现写一个明确的“两个或多个”子句比写“一个”和“一个或多”子句更干净。