Lisp-1 和 Lisp-2 有什么区别?

问题描述 投票:0回答:3

我试图理解 Lisp-1 和 Lisp-2 之间的区别以及它与 Clojure 的关系,但我仍然没有正确理解。谁能启发我吗?

clojure lisp lisp-2
3个回答
91
投票

您可能想阅读理查德·加布里埃尔 (Richard Gabriel) 撰写的这篇论文。它总结了 Lisp 社区在 Lisp1 与 Lisp2 中讨论的问题。前几节有点密集且进展缓慢,但当你读完第 5 节时,阅读起来就容易多了。

基本上,Lisp1 有一个将符号映射到值的环境,这些值可以是“常规”值,也可以是函数。 Lisp2 有(至少)两个命名空间(符号有一个用于函数值的槽,一个用于常规值)。因此,在 Lisp2 中,您可以拥有一个名为 foo 的函数和一个名为 foo 的值,而在 Lisp1 中,名称 foo 只能引用单个值(函数或其他值)。

两者之间存在一些权衡和品味差异,但请阅读论文了解详细信息。 Christian Queinnec 的书《Lisp in Small Pieces》也讨论了文本中的差异。


76
投票

根据维基百科

函数的独立命名空间是否具有优势是 Lisp 社区争论的焦点。它通常被称为 Lisp-1 与 Lisp-2 之争。 Lisp-1 指的是Scheme 的模型,Lisp-2 指的是Common Lisp 的模型。

这基本上是关于变量和函数是否可以具有相同的名称而不发生冲突。 Clojure 是 Lisp-1,这意味着它不允许函数和变量同时使用相同的名称。


0
投票

在 Lisp-1 中,符号只能有 1 个值。在 Lisp-2 中,符号可以有两个值,即 1) 符号被解释为函数时的值,2) 符号被解释为值时的值。

在实现中,包含与符号关联的值的结构只有一个用于指向数据和类型的指针的槽。在 Lisp-2 中,有两个指针,一个是函数值,另一个是变量值。

在 Common Lisp(Lisp-2)中,您可以调用 (symbol-function ‘a) (符号值‘a) 分别获取函数和值。 如果 ‘a 被定义为 add 函数并且 (setq a 3)then (一一一1) 将返回 7.

在 lisp 1 中你不能这样做,因为 a 只能是一件事,并且上下文不会改变含义。

在 Common Lisp 中#’是符号函数的缩写。 (setf (符号函数 ‘a) #’+ ) 会将 a 设置为函数 sum。

如果您愿意,您可以创建一个函数 a ,将 a 设置为调用 a 最后返回的值,也许 a 的计算成本很高。

在 Lisp-2 中,如果您将一个函数分配给一个符号,那么要调用该函数,您可以使用 funcall 运算符。

© www.soinside.com 2019 - 2024. All rights reserved.