54

我的一个朋友提请我注意第四届欧洲 Lisp 研讨会的欢迎词:

... 任何 Lisp 方言的实现和应用,包括 Common Lisp、Scheme、Emacs Lisp、AutoLisp、ISLISP、Dylan、Clojure、ACL2、ECMAScript ......

然后问ECMAScript是否真的是Lisp的方言。真的可以这么认为吗?为什么?

是否有一套定义明确且明确的标准来帮助我们检测一种语言是否是 Lisp 的方言?或者是一种非常松散的方言(在这种情况下,我们可以将 Python、Perl、Haskell 等添加到 Lisp 方言列表中吗?)

4

9 回答 9

51

Brendan Eich 想为 Netscape 开发一种类似于 Scheme 的语言,但现实介入了,他最终不得不使用对于“普通”人来说看起来有点像 C 和 Java,但工作起来却像函数式语言的东西。

就我个人而言,我认为将 ECMAScript 称为“Lisp”是不必要的,但对每个人来说都是他自己的。真正的 Lisp 的关键似乎是数据结构表示法和代码表示法相同的特征,而 ECMAScript(或 Ruby 或 Python 或任何其他不是Lisp 的动态函数式语言)则不然。

警告:我没有 Lisp 凭据 :-)

于 2011-02-17T14:36:18.217 回答
35

它不是。正如您所指出的,它有很多功能根源,但现在许多其他非 lisp 语言也是如此。

Lisp 有一个使它们成为 lisp 的剩余特征,即 lisp 代码是根据 lisp 数据结构(同音性)编写的。这就是使 lisps 强大的宏系统成为可能的原因,也是为什么它在非 lispers 看来如此奇怪的原因。函数调用只是一个列表,其中列表中的第一个元素是函数的名称。

由于 lisp 代码只是 lisp 数据,因此可以用元编程做一些非常强大的东西,而这是其他语言无法做到的。许多 lisp,甚至像 clojure 这样的现代 lisp,在很大程度上都是作为一组宏实现的。

于 2011-02-17T14:43:31.157 回答
23

尽管我不会将 JavaScript 称为 Lisp,但在我看来,它比大多数主流语言(甚至是函数式语言)更类似于 Lisp 的做事方式。

一方面,就像 Lisp 一样,它本质上是一种简单的命令式语言,基于适合由 REPL 驱动的无类型 lambda 演算。

其次,在 JavaScript 中嵌入文字数据(包括 lambda 表达式形式的代码)很容易,因为它的一个子集等同于 JSON。这是一种常见的 Lisp 模式。

第三,它的值和类型模型非常混乱。它在广义上是面向对象的,因为所有值都有一个标识的概念,但在大多数狭义上它并不是特别面向对象的。就像在 Lisp 中一样,对象是有类型的并且非常动态。代码通常被分成函数单元,而不是类。

事实上,在 JavaScript 世界中有几个(或多或少)最近的发展,让这门语言有时让人觉得很笨拙。以 jQuery 为例。在我看来,将 CSS 选择器作为子语言嵌入是一种非常类似于 Lisp 的方法。或者考虑一下 ECMAScript Harmony 的元对象协议:它看起来确实像 Common Lisp 的直接端口(比 Python 或 Ruby 的元对象系统都多!)。名单还在继续。

JavaScript 确实缺少宏和带有编辑器集成的 REPL 的合理实现,这是不幸的。当然,来自其他语言的影响也非常明显(不一定是坏的方式)。尽管如此,Lisp 和 JavaScript 阵营之间仍有大量的文化兼容性。有些可能是巧合(比如最近兴起的 JavaScript JIT 编译),有些是系统性的,但肯定是存在的。

于 2011-02-17T16:06:24.923 回答
10

如果你调用 ECMAScript Lisp,你基本上是在断言任何动态语言都是 Lisp。由于我们已经有了“动态语言”,所以您将“Lisp”简化为它的无用同义词,而不是让它具有更具体的含义。

Lisp 应该正确地引用具有某些属性的语言。

一种语言是 Lisp,如果:

  • 它的源代码是树状结构的数据,它有一个简单的打印符号作为嵌套列表。每个可能的树结构都有相应的符号表示,并且容易被赋予作为构造的含义;符号本身不必扩展来扩展语言。

  • 树结构数据是语言本身的主要数据结构,它使程序容易被程序操作。

  • 该语言具有符号数据类型。符号有一个被嵌入的印刷表示:当一个符号的相同印刷符号的两个或多个实例出现在符号中时,它们都表示同一个对象。

    • 符号对象的主要优点是它不同于所有其他符号。在 Lisp 程序的语义中,符号以各种方式与各种其他实体配对,从而充当这些实体的名称。
    • 例如,Lisp 的方言通常有变量,就像其他语言一样。在 Lisp 中,变量由符号(内存中的对象)而不是文本名称表示。当 Lisp 程序的一部分定义了一些 variablea时,其语法a是一个符号对象而不是字符串"a",它只是用于打印目的的符号名称。对变量的引用,即程序中其他地方编写的表达式a,也是一个 on 对象。由于符号的工作方式,它是同一个对象;然后,此对象相同性将引用连接到定义。对象相同性可以实现为指针相等在机器级别。我们知道两个符号值是相同的,因为它们是指向堆中相同内存位置的指针(符号类型的对象)。
    • 恰当的例子:NewLisp 方言对大多数数据类型(包括嵌套列表)具有非传统的内存管理,通过使符号以上述方式运行来使符号例外。没有这个,就不会是 Lisp。引用:“newLISP 中的对象(不包括符号和上下文)通过值复制传递给其他用户定义的函数。因此,每个 newLISP 对象只需要一个引用。” [强调我的]。传递符号(如通过值复制)也会破坏它们的标识:接收符号的函数不会获得原始符号,因此无法正确接收其标识。
  • Lisp 语言中的复合表达式——不是像数字或字符串这样的简单基本表达式——由一个简单的列表组成,其第一个元素是指示操作的符号。其余元素(如果有)是参数表达式。Lisp 方言应用某种评估策略来将表达式简化为一个值,并引发它可能具有的任何副作用。
  • 暂时认为列表由包含值对的二进制单元组成,由一个特殊的空列表对象终止,可能应该被视为 Lisp 定义的一部分:能够从一个新列表中创建一个新列表的整个业务通过在前面“consing”一个新项目,以及对列表的“first”和“rest”的简单递归,等等。

然后我会停在那里。有些人认为 Lisp 系统必须是交互式的:提供一个带有监听器的环境,其中一切都是可变的,并且可以随时重新定义等等。有些人认为 Lisps 必须具有一流的功能:必须有lambda操作符等等。坚定的传统主义者甚至可能坚持认为必须有carcdr函数,点对符号支持不正确的列表,并且列表必须由单元组成,并以nil表示空列表的特定符号终止,并且也是布尔值 false。坚持carcdr允许 Scheme 是一个 Lisp,但nil作为列表终结者和错误规则

然而,我们对“Lisp 方言”的定义越深入,它就越政治化。人们对他们最喜欢的方言(也许是他们自己创造的)因某些技术性而被排除在外而感到不安。坚持carcdr允许 Scheme 成为 Lisp,但nil作为列表终止符和错误将其排除在外。什么,Scheme 不是 Lisp?

因此,基于上述情况,ECMAScript 不是 Lisp 的方言。但是,ECMAScript 实现包含可以作为 Lisp 方言公开的功能,并且已经开发了许多这样的方言。出于某些情感原因需要将 ECMAScript 视为 Lisp 的人也许应该对此感到满意:支持 Lisp 的语义已经存在,并且只需要对该语义的合适接口,该接口可以在 ECMAScript 中开发并且可以互操作使用 ECMAScript 代码。

于 2016-10-14T21:57:46.947 回答
6

不,这不对。

为了被认为是一个 Lisp,一个必须是谐音的,而 ECMAscript 不是。

于 2011-02-17T14:51:41.310 回答
6

不是“方言”。我在 70 年代学习 LISP 并且从那以后就没有使用它,但是当我最近学习 JavaScript 时,我发现自己认为它类似于 LISP。我认为这是由于两个因素:(1)JSON 是一个类似列表的关联结构,(2)看起来 JS 的“对象”本质上是 JSON。因此,即使您不像在列表中编写 LISP 那样使用 JSON 编写 JS 程序,但您几乎可以这样做。

所以我的回答是,熟悉 LISP 的程序员在使用 JavaScript 时会有足够多的相似之处。Java 套装中的 JS = LISP 之类的语句 只是表达了这种感觉。我相信这就是它的全部。

于 2015-11-15T06:32:36.377 回答
6

是的。引用克罗克福德的话:

“JavaScript 与 Scheme 有很多共同之处。它是一种动态语言。它具有灵活的数据类型(数组),可以轻松模拟 s 表达式。最重要的是,函数是 lambda。

由于这种高度相似性,[递归编程入门] 'The Little Schemer' 中的所有函数都可以用 JavaScript 编写。”
http://www.crockford.com/javascript/little.html

关于同音性,我建议将这个词与 JavaScript 一起搜索。说它“不是同音”是真的,但不是故事的结局。

于 2017-04-25T01:31:57.993 回答
4

我认为 ECMAScript 是 LISP 的一种方言,就像英语是法语的一种方言一样。有共同点,但你会在一个只掌握另一个知识的情况下完成任务:)

有趣的是,第四届欧洲 Lisp 研讨会的三个主题演讲中只有一个直接涉及 Lisp(另外两个是关于 x86/JVM/Python 和 Scala)。

于 2011-02-17T15:35:24.413 回答
4

“方言”肯定是太过分了。尽管如此,作为一个学习和使用过 Python、Javascript 和 Scheme 的人,Javascript 显然比 Python 更具有 Lisp 的感觉(Coffeescript 可能更是如此)。

至于为什么欧洲 Lisp Symposium 想要将 Javascript 描述为 Lisp,显然他们想利用 Javascript 的流行度,因为 Javascript 的程序员人数比他们列表中所有其他 Lisp 方言的总和大很多倍.

于 2013-01-17T20:15:12.397 回答