clojure - Is this a correct characterisation of the behaviours of square brackets in Scheme, Racket, Common Lisp, and Clojure?
问题描述
I've recently done some digging. Due to my lack of Lisp experience, I want to verify what I've found. Is this a correct characterisation of the behaviours of square brackets in Scheme, Racket, Common Lisp, and Clojure?
- R5RS and R7RS Scheme: Square brackets are reserved in the spec "for possible future extensions to the language" (page 6 for R5RS and page 9 for R7RS), but implementations tend to implement square brackets as R6RS Scheme does below. Racket is one such example, even having community conventions for where to prefer square brackets.
- R6RS Scheme: "Matched square brackets can be used synonymously with parentheses". In other words, square brackets are valid brackets as long as they match. Alternative source.
- Common Lisp: Square brackets are reserved so the user can give them meaning via reader macros. They do not have meaning within the standard language, except inside
FORMAT
control strings. - Clojure: Square brackets for vectors and parentheses for lists. These are not the same thing.
解决方案
我认为对于Scheme,你是对的。
在 Common Lisp 中,标准不是 CLtL2,而是 ANSI 标准,在所有意图和目的上都与 CLHS 相同(例如https://clhs.lisp.se)。读者行为在第 2 节中定义。默认情况下(即在标准语法中)方括号是组成字符,因此可以在符号名称中使用它们而无需特殊转义。例如,[
, []
, ][
, APPLE-][
, >][<
,[[[
等都是有效的符号名称,无需转义即可使用。然而,这些字符是明确保留给程序员在他们自己的可读表中使用的。有几个库使用它,例如用于 SQL 文字的 CLSQL。
在 Clojure 中,方括号表示向量,它是一种独立于列表的集合。代码中文字向量的求值是在内部构造一个新的求值形式的向量。示例:计算为 的值、名为 的符号以及 和 的值之和[a 'b (+ a b)]
的新向量。宏和其他特殊形式通常将向量用于不作为函数调用进行评估的语法部分。示例:— 在函数定义主体中作为形式参数绑定的符号向量。 —和的词法绑定。a
b
a
b
(defn foo [a b c] …)
(let [a 1 b (+ a forble)] …)
a
b
推荐阅读
- c# - MvvmCross 7 如何在 WPF (.net Core 3.1) 应用程序中设置 Serilog
- javascript - 从 url 中删除空查询字符串
- vb.net - 从 ALPHA VANTAGE VB.NET 解析带有句点的 JSON 数据
- puppeteer - Node.js Puppeteer 如何获取 TR ID 值?
- php - 将数据保存到另一个表后插入另一个表
- java - 如何通过 Firebase 添加注册?
- javascript - 设置按钮超时 - 禁用登录
- c# - 等距网格中的钳位作用距离
- java - DOC 到 PDF 的转换,为什么 FileOutputStream 会生成损坏的 pdf?
- javascript - VS Code 中的 JavaScript 代码分析 - 防止重新声明变量等