ECMAScript真的是Lisp的一种方言吗?

时间:2011-02-17 14:33:58

标签: javascript lisp ecma262

我的一位朋友提请我注意4th European Lisp Symposium的欢迎信息:

  

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

然后询问ECMAScript是否真的是Lisp的方言。真的可以这样考虑吗?为什么呢?

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

9 个答案:

答案 0 :(得分:42)

Brendan Eich希望为Netscape做一个类似Scheme的语言,但现实干预了,他最终不得不做一些看起来模糊地像C和Java一样的“普通”人,但是工作就像一种功能语言。

就我个人而言,我认为调用ECMAScript“Lisp”是一种不必要的延伸,但对于每个人来说都是如此。关于真正的Lisp的关键似乎是数据结构符号和代码符号相同的特性,而且ECMAScript(或者Ruby或Python或任何其他 Lisp的动态函数语言)都不是这样。

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

答案 1 :(得分:21)

不是。它有很多功能根源,但正如你所指出的那样,现在还有很多其他非lisp语言。

Lisps有一个剩余的特性使它们成为lisps,这就是lisp代码是用lisp数据结构(homoiconicity)编写的。这就是lisps强大的宏系统的原因,以及为什么它看起来如此非暴力非lispers。函数调用只是一个列表,其中列表中的第一个元素是函数的名称。

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

答案 2 :(得分:18)

即使我不把JavaScript称为Lisp,但在我看来,与大多数主流语言(甚至功能性语言)相比,它更像是Lisp的做事方式。

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

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

第三,它的值和类型模型是非常 lispy。它在广义上是面向对象的,因为所有的价值观都有一个同一性的概念,但在这个词的最狭义的意义上,它并不是特别面向对象的。就像在Lisp中一样,对象是键入的并且非常动态。代码通常分为函数单元,而不是类。

事实上,JavaScript世界中有一些(或多或少)最近的发展使得该语言有时会感觉非常糟糕。以jQuery为例。在我看来,嵌入CSS选择器作为子语言是一种非常类似于Lisp的方法。或者考虑一下ECMAScript Harmony的metaobject协议:它看起来像是Common Lisp的直接端口(比Python或Ruby的元对象系统要多得多!)。名单还在继续。

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

答案 3 :(得分:5)

不,不是。

为了被认为是Lisp,必须是homoiconic,ECMAscript不是。

答案 4 :(得分:4)

我认为ECMAScript是LISP的一种方言,意思是英语是法语的方言。虽然有共同之处,但只有在掌握了另一个人的情况下,你才能在一个武装分配中遇到麻烦:)

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

答案 5 :(得分:4)

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

所以我的答案是,有足够的相似之处,熟悉LISP的程序员在使用JavaScript时会被提醒。像 JS = LISP在Java诉讼中的陈述只表达了这种感觉。我相信这就是它的全部。

答案 6 :(得分:3)

“方言”肯定会拉得太远。尽管如此,作为一个已经学习并使用过Python,Javascript和Scheme的人,Javascript显然对它有很大的感觉(而且Coffeescript可能更多),而不是Python。

至于为什么欧洲Lisp研讨会想要将Javascript描述为Lisp,显然他们想要依赖于Javascript的流行程度,其程序员人口比其他所有Lisp方言都大很多倍。他们的名单合起来了。

答案 7 :(得分:3)

如果你调用ECMAScript Lisp,你基本上断言任何动态语言都是Lisp。由于我们已经拥有了#34;动态语言",您正在减少" Lisp"它是一个无用的同义词,而不是让它具有更具体的含义。

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

语言是Lisp if:

  • 它的源代码是树形结构数据,它有一个简单的印刷符号作为嵌套列表。每个可能的树结构都具有相应表示法的渲染,并且易于被赋予作为构造的含义;表示法本身并不需要扩展以扩展语言。

  • 树形结构数据是语言本身的主要数据结构,使程序易受程序操纵。

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

    • 符号对象的主要优点是它与所有其他符号不同。符号在Lisp程序的语义中以各种方式与各种其他实体配对,从而作为这些实体的名称。
    • 例如,Lisp的方言通常有变量,就像其他语言一样。在Lisp中,变量由符号(内存中的对象)而不是文本名称表示。当Lisp程序的一部分定义了一些变量a时,a的语法是一个符号对象,而不是字符串"a",它只是该符号的名称。印刷的目的。对变量的引用,在程序的其他地方写为a的表达式,也是一个on对象。由于符号的工作方式,它是同一个对象;然后,此对象相同性将引用连接到定义。对象相同性可以在机器级别实现为指针相等。我们知道两个符号值是相同的,因为它们是指向堆中相同内存位置的指针(符号类型的对象)。
    • 例证:具有a non-traditional memory management for most data types, including nested lists的NewLisp方言通过使符号以上述方式运行来使符号例外。没有它,它就不会是Lisp。引用:" newLISP中的对象(排除符号和上下文)通过值复制传递给其他用户定义的函数。因此,每个newLISP对象只需要一个引用。" [强调我的]。通过价值复制也传递符号会破坏他们的身份:接收符号的函数不会获得原始符号,因此无法正确接收其身份。
  • Lisp语言中的复合表达式 - 不是简单的原色如数字或字符串 - 由简单列表组成,其第一个元素是表示操作的符号。其余元素(如果有)是参数表达式。 Lisp方言应用某种评估策略将表达式减少到一个值,并引起它可能产生的任何副作用。
  • 我会暂时认为列表由二进制单元格构成,这些二进制单元格包含一对值,由一个特殊的空列表对象终止,可能应该被认为是Lisp定义的一部分:整个业务的能够通过" consing"从现有的列表中创建一个新的列表。一个新的项目在前面,并轻松递归'#34;第一"和"休息"列表,等等。

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

我们越是深入研究" Lisp方言"的定义,越是政治化;人们对他们最喜欢的方言(也许是他们自己创造的方言)被某种技术性排除在外的人感到不安。坚持nilcar允许Scheme成为Lisp,但是cdr是列表终止符并且false将其排除。什么,Scheme不是Lisp?

因此,基于以上所述,ECMAScript不是Lisp的方言。但是,ECMAScript实现包含可以作为Lisp方言和numerous such dialects have been developed公开的功能。由于某些情感原因,需要ECMAScript被认为是Lisp的人应该满足于此:支持Lisp的语义就在那里,只需要一个合适的语义接口,可以在ECMAScript中开发并且可以互操作使用ECMAScript代码。

答案 8 :(得分:2)

是的,确实如此。引用克罗克福德:

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

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

关于同性恋的主题,我建议在JavaScript中搜索该单词。说这是"不是同性恋"这是真的,但不是故事的结局。