在通用Lisp中,let使用一个绑定列表,即:
(let ((var1 1)
(var2 2))
...)而Clojure则使用向量:
(let [a 1
b 2]
...)除了可读性之外,是否有任何特定的原因让Clojure使用向量?
发布于 2015-03-31 09:56:03
您可以在简单容易 -幻灯片14上找到Rich的论点,大约26分钟:

发布于 2015-03-31 17:02:40
里奇对此的看法如下:
“既然我们讨论的是语法,那么让我们来看看经典的Lisp。这似乎是最简单的语法,所有东西都是符号、数字和其他一些东西的括号列表。还有什么能更简单呢?但在现实中,这并不是最简单的,因为为了实现这种统一,清单的含义必须大量超载。它们可能是函数调用、分组结构或数据文字等,并确定哪些需要使用上下文,在扫描代码以评估其含义时增加认知负荷。Clojure将更多的复合数据文本添加到列表中,并将它们用于语法。这样做意味着列表几乎总是类似调用的东西,向量用于分组,而地图有自己的文字。从一种数据结构转变为三种数据结构大大减少了认知负荷。“
他认为标准语法中超载的一件事是访问时间。因此,参数中的向量语法与使用它们时的常量访问时间有关。他说:
但是,似乎很奇怪,因为它只在一个form...as存储在变量中或以任何方式传递信息“丢失”时才对它有效。例如..。
(defn test [a]
(nth a 0)) ;;<- what is the access time of and element of a?我个人更喜欢苛刻的语法修改,比如括号,以便在程序员不得不转换心理模型时使用,例如嵌入式语言。
;; Example showing a possible syntax for an embedded prolog.
{size [],0}
{size([H|T],N) :- size(T,N1), N is N1+1}
(size '(1 2 3 4) 'n) ;; here we are back to lisp code这样的概念在句法上是固定不变的。您不会在运行时“传递”结构。在运行之前(读取/宏/编译时间)是另一回事,因此,在可能的情况下,通常最好将内容保留为列表。
[edit]最初的消息来源似乎已经消失,但下面是另一个采访记录:https://gist.github.com/rduplain/c474a80d173e6ae78980b91bc92f43d1#file-code-quarterly-rich-hickey-2011-md
https://stackoverflow.com/questions/29365000
复制相似问题