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

Emr*_*inç 47 javascript lisp ecma262

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

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

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

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

Poi*_*nty 44

布兰登·艾克想做为Netscape一个方案,如语言,但现实干预和他最终不得不凑合用的东西,看上去隐约像C和Java为"正常"的人,但工作就像一个功能性的语言.

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

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

  • +1完全同意.如果我们考虑使用一些函数式编程语言作为LISP方言,我们必须包括C#和VB.NET.我认真地认为这两个不算是LISP方言.我认为"代码作为数据"是LISP的定义特征:如果有人试图将具有"代码作为数据"灵活性的非LISP命名,那么人们就会理解为什么. (2认同)
  • @Sprague 是的,对不起;我可能不应该使用术语“JSON”。可能是动态类型和一流函数的结合让人们想到了 Lisp。 (2认同)
  • @R.MartinhoFernandes Forth 语言是一种具有“代码即数据”灵活性的非 Lisp 语言。那么为什么连接语言如此强大而不是 Lisp 呢?因为它们融合了一些相同的简单性——它们是可扩展的。仅举几例,几乎没有保留字,几乎没有语法,具有同像性,并显示出强大的函数模式,允许轻松组合(函数管道)。其他连接语言,如 Factor、Joy 和 Cat,似乎也具有类似的属性。这就像水晶和普通岩石之间的区别——纯度很重要! (2认同)

mbl*_*inn 23

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

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

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

  • 我肯定会在某些时候使用"homoiconicity" (8认同)
  • 这比本页上的其他任何内容都更正确。 (3认同)

Mat*_*ard 20

虽然我不会把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编译的兴起),有些是系统的,但肯定存在.

  • 嗯……确实,第 1 方面和第 3 方面可能有些重叠。其他的(命令式(!)、子语言和文字数据的嵌入、MOP、JIT 编译)是否也遵循无类型 lambda 演算核心?我会说他们没有,但话又说回来,无论如何,这并不是一个逐个功能的比较,而是一个支持文化接近的论点。实际上,我不排除这种接近的全部原因可能是*因为*两者都比大多数语言更强烈地基于(对无类型 lambda 演算的命令式解释)。 (3认同)

All*_*dow 6

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

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


Mar*_*rko 5

不,这不对.

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


Kaz*_*Kaz 5

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

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

语言是Lisp,如果:

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

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

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

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

然后我就停在那里。有些人认为Lisp系统必须是交互式的:为环境提供一个侦听器,在该环境中,所有内容都是可变的,并且可以在任何时间进行重新定义等等。有些人认为Lisps必须具有一流的功能:必须有一个lambda运算符,依此类推。坚定的传统主义者甚至可能会坚持认为必须carcdr功能,该点对符号配套不当名单,而名单必须由专门的符号由细胞组成的,并终止nil表示空列表,也是一个布尔值false。坚持carcdr允许Scheme成为Lisp,但nil成为列表终止符和错误规则

但是,我们对“ Lisp方言”的定义越深入,它就越具有政治意义。人们会为自己最喜欢的方言(也许是他们自己创造的方言)在某种技术上被排除而感到沮丧。坚持carcdr允许Scheme成为Lisp,但是nil成为列表终止符并用虚假的方式排除它。什么,计划不是Lisp?

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


Eri*_* H. 5

是的。引用克罗克福德:

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

由于这种相似性,[递归编程入门]“小计划者”中的所有功能都可以用JavaScript编写。”
http://www.crockford.com/javascript/little.html

关于谐音,我建议您将该词与JavaScript一起搜索。说这不是“谐音”是正确的,但并非故事的结局。