我的一位朋友提请我注意4th European Lisp Symposium的欢迎信息:
......的实施和应用 任何Lisp方言,包括 Common Lisp,Scheme,Emacs Lisp, AutoLisp,ISLISP,Dylan,Clojure, ACL2, ECMAScript ,...
然后询问ECMAScript是否真的是Lisp的方言。真的可以这样考虑吗?为什么呢?
是否有明确定义的明确标准来帮助我们检测语言是否是Lisp的方言?或者是一种非常松散的方言(在这种情况下,我们可以将Python,Perl,Haskell等添加到Lisp方言列表中吗?)
答案 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:
它的源代码是树形结构数据,它有一个简单的印刷符号作为嵌套列表。每个可能的树结构都具有相应表示法的渲染,并且易于被赋予作为构造的含义;表示法本身并不需要扩展以扩展语言。
树形结构数据是语言本身的主要数据结构,使程序易受程序操纵。
该语言具有符号数据类型。符号具有实习的打印表示:当符号中出现符号的相同打印符号的两个或更多实例时,它们都表示相同的对象。
a
时,a
的语法是一个符号对象,而不是字符串"a"
,它只是该符号的名称。印刷的目的。对变量的引用,在程序的其他地方写为a
的表达式,也是一个on对象。由于符号的工作方式,它是同一个对象;然后,此对象相同性将引用连接到定义。对象相同性可以在机器级别实现为指针相等。我们知道两个符号值是相同的,因为它们是指向堆中相同内存位置的指针(符号类型的对象)。然后我会在那里停下来。有些人认为Lisp系统必须是交互式的:提供一个带有监听器的环境,其中一切都是可变的,并且可以随时重新定义等等。有些人认为Lisps必须具有一流的功能:必须有一个lambda
运算符等等。坚定的传统主义者甚至可能坚持认为必须有car
和cdr
函数,虚线对符号支持不正确的列表,并且列表必须由单元格组成,并且特别是符号{{ 1}表示空列表,也表示布尔值false。坚持nil
和car
允许Scheme成为Lisp,但cdr
是列表终止符和错误规则
我们越是深入研究" Lisp方言"的定义,越是政治化;人们对他们最喜欢的方言(也许是他们自己创造的方言)被某种技术性排除在外的人感到不安。坚持nil
和car
允许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中搜索该单词。说这是"不是同性恋"这是真的,但不是故事的结局。