Clojure让vs Common Lisp让

时间:2015-03-31 09:20:35

标签: clojure lisp common-lisp let

在Common Lisp中,let使用绑定列表,即:

(let ((var1 1)
      (var2 2))
  ...)

虽然Clojure使用了矢量:

(let [a 1
      b 2]
  ...)

除了可读性之外,Clojure使用向量是否有任何具体原因?

2 个答案:

答案 0 :(得分:8)

您可以在Simple Made Easy找到Rich Hickey的论点 - 幻灯片14,大约26分钟:

Simple Made Easy - slide 14

答案 1 :(得分:3)

Rich对此的界限如下

  

“既然我们在谈论语法,那么让我们来看看吧   经典的Lisp。它似乎是最简单的语法,一切都是   带括号的符号,数字和其他一些东西的列表。什么   可能更简单?但实际上,它并不是最简单的,因为   实现这种均匀性,必须有大量的超载   列表的含义。它们可能是函数调用,分组   构造,或数据文字等。并确定哪些需要   使用上下文,在扫描代码时增加认知负荷   评估其含义。 Clojure添加了更多的复合数据文字   列表,并将它们用于语法。这样做意味着列表   几乎总是像呼叫一样的东西,矢量用于分组,   和地图有自己的文字。从一个数据结构转移到   三者大大降低了认知负担。“

他认为在标准语法中过载的一件事是访问时间。因此,参数中的向量语法与使用它们时的常量访问时间有关。他说:

看起来很奇怪,因为它只对那个表格有效......只要它存储在变量中或以任何方式传递信息都“丢失”。例如......

(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