Clojure中的方括号和花括号是否仍然是S表达式?


12

我正在尝试学习Lisp,并查看那里的所有Lips及其差异。

我看到在Scheme的某些实现中,您可以将方括号与圆括号互换使用以提高可读性,因此,由于对它们进行了相同的处理,因此我认为它们仍然像其他所有内容一样只是S表达式。

但是,在Clojure中,我看到方括号和花括号用于表示不同的数据类型,例如向量等。这些还是仍然有效的S表达式,还是必须将它们视为原子?这不是“破坏”整个S表达式的概念,从而使Clojure成为“不纯的” Lisp吗?


从技术上讲,“如果方括号是s表达式,那么如何用括号来表示呢?” 不是问题的一部分,但这就是我想知道的。
Qwertie

Answers:


10

矢量和地图的文字表示法(即方括号和花括号)只是阅读时的糖,您可以用该表示法表示的任何内容也可以用S表达式表示。结果,没有损失任何功率或谐音,实际上,许多宏都提供了读取器宏(据我所知,它甚至更强大)。

顺便说一句,请注意,Clojure现在提供了一种用于创建自定义“标记”文字的机制,与其他文字一样,该文字在编译和解释之前已转换为S表达式。


1
嗯,您的回答使我觉得我对Lisp的了解比我想象的要少。所以,您说的是(我认为)方括号和大括号实际上不是S表达式本身。我认为使用Lisp输入的整个想法是,一切都是S表达式。看来我需要再进行一些挖掘,然后才能再次阅读您的答案。谢谢!
mydoghasworms

没错-它们不是S表达式。Lisp语法以S表达式开头,因为可以用该语言表达的所有内容都可以用S表达式表达。但是Lisp语法还不止于此:许多Lisp编译器都有一个显式的宏读取阶段,在该阶段中,源代码中的特殊模式被转换为S表达式。这使语言作者可以为程序员提供人性化的语法。需要注意的重要一点是,因为用这些特殊文字表示的任何内容也可以用S表达式表示,所以不会失去均等的好处。
tvachon

3

S表达式是数据的文本表示形式。数字,符号,缺点单元格,列表,字符串等。Common Lisp还具有数组,向量,更多数字类型,字符等的文本表示形式。Common Lisp还提供了用户可扩展的阅读器,以便用户可以添加数据类型的更多文本表示形式。有时,此机制还用于更改Lisp编程语言的语法(例如,支持其他编程语言中的中缀表达式或语句)。

因此,如果Lisp方言提供其他数据类型的文本表示形式,则非常适合s表达式的想法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.