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

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

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

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

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

Brendan Eich想为Netscape做一个类似Scheme的语言,但现实是干涉的,他最终不得不用一些看似C和Java的东西来代替“正常”的人,但是却像一种function性的语言一样工作

我个人认为把ECMAScript叫做“Lisp”是不必要的,但是对于他自己来说。 关于真正的Lisp的关键是数据结构符号和代码符号是相同的,ECMAScript(或者Ruby,Python或者其他任何不是 Lisp的dynamic函数语言) 都不是这样

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

不是。 它有很多的function根源,但是正如你指出的那样,现在还有很多其他的非俚语。

Lisp有一个剩余的特性,使得它们可以查询Lisp代码是用lisp数据结构(homoiconicity)编写的。 这是什么使Lisps强大的macros观系统,以及为什么它看起来非常蔑视非Lispers。 函数调用只是一个列表,其中列表中的第一个元素是函数的名称。

由于lisp代码只是lisp数据,所以可以使用元编程来做一些非常强大的function,这在其他语言中是无法做到的。 许多口头禅,甚至像clojure这样的现代的口头禅,在很大程度上都是作为一套macros而实施的。

尽pipe我不会把JavaScript称为Lisp,但我认为,这与Lisp的做法相比,大多数主stream语言(甚至是function性语言)更类似于Lisp。

就像Lisp一样,它本质上是一个简单的命令式语言,它基于适合由REPL驱动的无typeslambda演算。

其次,在JavaScript中embedded文字数据(包括以lambdaexpression式forms的代码)很容易,因为它的一个子集相当于JSON。 这是一个常见的Lisp模式。

第三,它的价值观和types模型非常不礼貌。 从广义上说,它是面向对象的,所有的值都有一个同一性的概念,但是在这个单词的最狭义的意义上,它并不特别面向对象。 就像在Lisp中一样,对象也是input的,而且非常dynamic。 代码通常分为function单元,而不是类。

事实上,在JavaScript世界中有一些(或多或less)最近的发展,使得语言有时候感觉很差。 以jQuery为例。 在我看来,将CSSselect器embedded为子语言是一种非常类似于Lisp的方法。 或者考虑一下ECMAScript Harmony的元对象协议:它看起来像Common Lisp的一个直接的端口(比Python或者Ruby的元对象系统要好得多)。 名单继续。

JavaScript确实没有macros,而且编辑器集成也是一个合理的REPL实现,这是不幸的。 当然,其他语言的影响也非常明显(不一定是坏的)。 不过,Lisp和JavaScript阵营之间还存在着大量的文化兼容性。 其中一些可能是巧合的(如JavaScript JIT编译最近的兴起),有些是系统的,但肯定是存在的。

不,这不对。

为了被认为是一个Lisp,必须是同态的,ECMAscript不是。

我认为ECMAScript是LISP的一种方言,就像英语是法语方言一样。 有共同点,但是你只会在另一个人的知识的情况下在一个武装的任务中遇到麻烦:)

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

“方言”肯定会拉长得太远。 尽pipe如此,作为学习和使用Python,Javascript和Scheme的人员,Javascript显然比Python更具有Lisp-ier感觉(而Coffeescript可能更是如此)。

至于为什么欧洲的Lisp研讨会希望将Javascript描述为一个Lisp,显然他们希望搭载程序员人数多的Javascript的stream行度,比其他列表中Lisp方言的其余部分多出许多倍。

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

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

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

Lisp应该适当地引用具有特定属性的语言。

语言是Lisp,如果:

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

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

  • 该语言具有符号数据types。 符号具有被打印的表示forms:当符号的相同打印符号的两个或多个实例出现在符号中时,它们全部表示相同的对象。

    • 符号对象的主要优点在于它与所有其他符号不同。 符号在Lisp程序的语义中以各种方式与各种其他实体配对,从而充当这些实体的名称。
    • 例如,Lisp的方言通常有variables,就像其他语言一样。 在Lisp中,variables由符号(内存中的对象)表示,而不是文本名称。 当Lisp程序的一部分定义了一些variablesa ,这个a的语法是一个符号对象,而不是string"a" ,而这个string就是用于打印的符号名称。 对variables的引用,在程序中其他地方写的expression式也是一个对象。 由于符号工作的方式,它是同一个对象; 这个对象相同然后连接到定义的引用。 对象相同性可以在机器级别实现为指针相等 。 我们知道两个符号值是相同的,因为它们是指向堆中相同内存位置(符号types的对象)的指针。
    • 例如, 对于大多数数据types(包括嵌套列表)具有非传统内存pipe理的NewLisp方言,通过使它们以上述方式行为,使符号exception。 没有这个,它不会是Lisp。 Quote: “newLISP中的对象( 不包括符号和上下文)通过值复制传递给其他用户定义的函数。因此,每个newLISP对象只需要一个引用。 [强调我的]。 传递符号,如通过值复制,将破坏他们的身份:接收符号的函数将不会得到原来的,因此不正确地接收其身份。
  • Lisp语言中的复合expression式 – 不是像数字或string这样简单的初始化 – 由一个简单的列表组成,它的第一个元素是一个表示操作的符号。 其余元素(如果有的话)是参数expression式。 Lisp方言应用某种评估策略来将expression式减less到某个值,并唤起其可能产生的副作用。
  • 试图争辩说,列表是由二进制单元格组成的,这些单元格由一个特殊的空列表对象结尾,可能应该被认为是Lisp定义的一部分:能够创build一个新列表的整个业务现有的一个是将一个新的项目“收回”到前面,一个列表中的“第一个”和“rest”的简单recursion,等等。

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

我们越是深入“Lisp方言”的定义,它就变得更加政治化。 人们对他们最喜欢的方言(也许是他们自己创造的)在某种技术性上被排除而感到不安。 坚持carcdr可以让Scheme成为一个Lisp,但是不能成为列表的终结者和错误。 什么,计划不是一个Lisp?

所以,基于上述,ECMAScript不是Lisp的一种方言。 但是,ECMAScript实现包含可以作为Lisp方言公开的function,并且已经开发了许多这样的方言 。 有些人因为某些情感原因需要将ECMAScript视为Lisp,应该可以满足这一点:支持Lisp的语义就在那里,只需要一个合适的语义接口,可以在ECMAScript中开发,并且可以互操作与ECMAScript代码。

是的。 引用Crockford:

“JavaScript和Scheme有许多共同之处,它是一种dynamic语言,它有一个灵活的数据types(数组),可以很容易地模拟sexpression式,最重要的是,函数是lambdas。

由于这种深刻的相似性,[小程序]中的所有函数都可以用JavaScript编写。
http://www.crockford.com/javascript/little.html

关于homoiconicity的问题,我会build议search与JavaScript一起的单词。 说这是“不homoiconic”是真实的,但不是故事的结束。