问题描述
我最近做了一些挖掘工作。由于我缺乏 Lisp 经验,我想验证一下我发现了什么。这是对 Scheme、Racket、Common Lisp 和 Clojure 中方括号行为的正确表征吗?
- R5RS 和 R7RS 方案:方括号保留在规范“用于未来可能的语言扩展”(R5RS 的第 6 页和 R7RS 的第 9 页) ,但实现倾向于实现方括号,就像下面的 r6rs Scheme 那样。 Racket is one such example,甚至有社区约定,在何处优先使用方括号。
- r6rs 方案:“Matched square brackets can be used synonymously with parentheses”。换句话说,只要方括号匹配,方括号就是有效的括号。 Alternative source。
- 普通 Lisp:Square brackets are reserved so the user can give them meaning via reader macros。它们在标准语言中没有意义,除了在
FORMAT
控制字符串中。 - Clojure:Square brackets for vectors and parentheses for lists。这些不是一回事。
解决方法
我认为对于 Scheme,你说得对。
在 Common Lisp 中,标准不是 CLtL2,而是 ANSI 标准,它的所有意图和目的都与 CLHS 相同(例如,在 https://clhs.lisp.se)。读取器行为在 section 2 中定义。 默认(即在标准语法中)的方括号是组成字符,因此它们可以在符号名称中没有特殊转义的情况下使用。例如,[
、[]
、][
、APPLE-][
、>][<
、[[[
等都是可以使用的有效符号名称没有逃避。然而,这些字符是明确保留给程序员在他们自己的可读表中使用的。几个图书馆使用这个,例如。 G。用于 SQL 文字的 CLSQL。
在 Clojure 中,方括号表示向量,它是一种与 e 不同的集合。 G。列表。代码中对文字向量的求值就是构造一个新的向量,里面包含求值形式。示例:[a 'b (+ a b)]
的计算结果为 a
的值、名为 b
的符号以及 a
和 b
的值之和的新向量。宏和其他特殊形式通常将向量用于不作为函数调用求值的语法部分。示例: (defn foo [a b c] …)
— 要绑定为函数定义主体中的形式参数的符号向量。 (let [a 1 b (+ a forble)] …)
— a
和 b
的词法绑定。