【发布时间】:2011-06-02 11:45:35
【问题描述】:
我试图了解 Lisp-1 和 Lisp-2 之间的区别以及这与 Clojure 的关系,但我仍然无法正确理解。谁能赐教?
【问题讨论】:
我试图了解 Lisp-1 和 Lisp-2 之间的区别以及这与 Clojure 的关系,但我仍然无法正确理解。谁能赐教?
【问题讨论】:
您可能想阅读 Richard Gabriel 撰写的 paper。它是 Lisp 社区在 Lisp1 与 Lisp2 中讨论的问题的总结。前几节内容有点密集且缓慢,但当你读完第 5 节时,它会更容易阅读。
基本上,Lisp1 有一个将符号映射到值的单一环境,这些值可以是“常规”或函数。 Lisp2 有(至少)两个命名空间(符号有一个用于函数值的槽和一个用于常规值的槽)。因此,在 Lisp2 中,您可以拥有一个名为 foo 的函数和一个名为 foo 的值,而在 Lisp1 中,名称 foo 只能引用单个值(函数或其他)。
两者之间存在一些权衡和口味差异,但请阅读论文了解详细信息。 Christian Queinnec 的书“Lisp in Small Pieces”也讨论了贯穿文本的差异。
【讨论】:
funcall 和 @ 987654324@ 运营商。这些在 Lisp-1 中消失了。
根据wikipedia:
单独的函数命名空间是否是一个优势是 Lisp 社区中争论的根源。它通常被称为 Lisp-1 与 Lisp-2 的辩论。 Lisp-1 指的是 Scheme 的模型,Lisp-2 指的是 Common Lisp 的模型。
这基本上是关于变量和函数是否可以具有相同的名称而不会发生冲突。 Clojure is a Lisp-1 表示它不允许函数和变量同时使用相同的名称。
【讨论】:
list 经常被用作函数参数而不是任何东西,天哪,因为(list ...) 是一个标准函数,所以这太令人困惑了。许多将list 作为变量的函数不使用list 函数,或者不在该变量附近使用它。即使发生这种情况也不算太糟:(list foo list)。这并不比像“打好仗”这样的句子更令人困惑,其中同一个词作为名词和动词出现。