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凭据:-)
mbl*_*inn 23
不是.它有很多功能根源,但正如你所指出的那样,现在还有很多其他非lisp语言.
Lisps有一个剩余的特性使它们成为lisps,这就是lisp代码是用lisp数据结构(homoiconicity)编写的.这就是lisps强大的宏系统的原因,以及为什么它看起来如此非暴力非lispers.函数调用只是一个列表,其中列表中的第一个元素是函数的名称.
由于lisp代码只是lisp数据,因此可以使用元编程来完成一些非常强大的功能,这在其他语言中是无法完成的.许多lisps,甚至像clojure这样的现代lisps,在很大程度上都是作为一组宏实现的.
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编译的兴起),有些是系统的,但肯定存在.
不是“方言”。我在 70 年代学习了 LISP,此后一直没有使用它,但是当我最近学习 JavaScript 时,我发现自己认为它类似于 LISP。我认为这是由于两个因素:(1) JSON 是一个类似列表的关联结构,(2) JS 的“对象”似乎本质上是 JSON。因此,即使您不像在列表中编写 LISP 那样使用 JSON 编写 JS 程序,您也差不多会这样做。
所以我的回答是有足够多的相似之处,熟悉 LISP 的程序员在使用 JavaScript 时会想起它。像Java 套装中的JS = LISP这样的语句 只是表达了这种感觉。我相信这就是全部。
如果调用ECMAScript Lisp,则基本上是在断言任何动态语言都是Lisp。由于我们已经有了“动态语言”,因此您要将“ Lisp”简化为无用的同义词,而不是让它具有更具体的含义。
Lisp应该正确地引用具有某些属性的语言。
语言是Lisp,如果:
它的源代码是树状结构的数据,它具有作为嵌套列表的简单打印符号。每个可能的树结构都有相应的表示形式的呈现,并且容易被赋予构造的含义。表示法本身不必扩展即可扩展语言。
树形数据是语言本身的主要数据结构,这使得程序容易受到程序的操纵。
该语言具有符号数据类型。符号具有中间的打印表示形式:当符号的两个或多个相同打印符号实例出现在该符号中时,它们都表示同一对象。
a
,其语法a
是符号对象,而不是字符串"a"
,字符串只是出于打印目的而使用的符号名称。对变量的引用,即a
在程序中其他位置编写的表达式,也是一个on对象。由于符号的工作方式,它是同一对象。然后,该对象相同性将引用连接到定义。对象相同性可以实现为指针相等在机器级别。我们知道两个符号值相同,因为它们是指向堆(符号类型的对象)中相同内存位置的指针。然后我就停在那里。有些人认为Lisp系统必须是交互式的:为环境提供一个侦听器,在该环境中,所有内容都是可变的,并且可以在任何时间进行重新定义等等。有些人认为Lisps必须具有一流的功能:必须有一个lambda
运算符,依此类推。坚定的传统主义者甚至可能会坚持认为必须car
和cdr
功能,该点对符号配套不当名单,而名单必须由专门的符号由细胞组成的,并终止nil
表示空列表,也是一个布尔值false。坚持car
并cdr
允许Scheme成为Lisp,但nil
成为列表终止符和错误规则
但是,我们对“ Lisp方言”的定义越深入,它就越具有政治意义。人们会为自己最喜欢的方言(也许是他们自己创造的方言)在某种技术上被排除而感到沮丧。坚持car
并cdr
允许Scheme成为Lisp,但是nil
成为列表终止符并用虚假的方式排除它。什么,计划不是Lisp?
因此,基于上述内容,ECMAScript不是Lisp的方言。但是,ECMAScript实现包含可以作为Lisp方言公开的功能,并且已经开发了许多这样的方言。出于某种情感原因,需要将ECMAScript视为Lisp的人也许应该对此感到满意:支持Lisp的语义已经存在,并且只需要一个适合该语义的接口即可在ECMAScript中开发并可以互操作。 ECMAScript代码。
是的。引用克罗克福德:
“ JavaScript与Scheme有很多共同点。它是一种动态语言。它具有灵活的数据类型(数组),可以轻松地模拟s表达式。最重要的是,函数是lambda。
由于这种相似性,[递归编程入门]“小计划者”中的所有功能都可以用JavaScript编写。”
http://www.crockford.com/javascript/little.html
关于谐音,我建议您将该词与JavaScript一起搜索。说这不是“谐音”是正确的,但并非故事的结局。
归档时间: |
|
查看次数: |
9272 次 |
最近记录: |