除了第一类函数和词法范围之外,JavaScript与Scheme实现还有什么共同之处?

除了第一类函数和词法范围之外,JavaScript与Scheme实现还有什么共同之处?,javascript,programming-languages,functional-programming,lisp,scheme,Javascript,Programming Languages,Functional Programming,Lisp,Scheme,我一直想知道,为什么道格拉斯·克罗克福德(Douglas Crockford)总是将JavaScript与Scheme进行比较。是的,JS计划由其设计师设计;但是,除了第一类函数支持和词法作用域(break)之外,JS与Scheme有哪些共同的特性使其成为“C语言中的Lisp”?另一件让人想到的事情是在整个语言和库中普遍使用一种无处不在的数据结构:Scheme中的cons list,maps(称为对象)对于ECMAScript 还有一个事实,ECMAScript不仅有一流的过程,而且这些过程是唯

我一直想知道,为什么道格拉斯·克罗克福德(Douglas Crockford)总是将JavaScript与Scheme进行比较。是的,JS计划由其设计师设计;但是,除了第一类函数支持和词法作用域(break)之外,JS与Scheme有哪些共同的特性使其成为“C语言中的Lisp”?

另一件让人想到的事情是在整个语言和库中普遍使用一种无处不在的数据结构:Scheme中的cons list,maps(称为对象)对于ECMAScript


还有一个事实,ECMAScript不仅有一流的过程,而且这些过程是唯一的抽象机制(或者更准确地说是封装机制)。

在我的脑海中,再加上看一眼:

  • 块体结构
  • 运行时检查
  • 评估
  • 无(显式)编译步骤
  • 小而富的标准数据库
  • 过程和变量的共享命名空间

这个列表中最重要的一件事是有一个REPL。这似乎是一个技术问题,特别是当这些REPL通常隐藏在一些“开发人员工具”的东西后面时,但它对语言有巨大的影响(例如,当有REPL时,自然会有一个真正的
eval
,等等)它基本上使代码的动态评估具有一流的地位,这对于JS之类的东西非常有用,并且可能比一流函数(直到几年前才真正使用)对其成功的贡献更大.

好吧,JavaScript缺少,这是Lisp方言的主要属性之一。

这个问题真的有一个有意义的、明确的答案吗?@Pointy:是的,除了第一类函数和词汇范围之外的任何功能都是有意义的、明确的答案。你知道吗?如果你想知道Doug为什么做某些事情,为什么不知道给道格发电子邮件?@肯:我不想回复这样轻率的回复,但我想指出的是,这不是道格为什么这么做的原因,而是论文是否正确,以及你是否有一个有意义的建议要站在哪一边。这可能与此相关。
(让我们来看看)
在Scheme中?我想ES5也会得到它。@Pointy:你是说ES6?是的,好吧,
let
已经很和谐了。基本上,
var
将被放弃,取而代之的是
let
(适当的词汇范围)和
const
(不能反弹).@Pointy,
let
只是一种语法糖。你可以在js中做同样的事情:
(函数(x){…})(…)
而不是
(let((x…))
@SK逻辑是的,我理解这一点,但它不仅仅是糖;实例化函数对象的成本有点高。(当然,我认为通过“let”可能也很重要。)@Pointy,我相信任何像样的功能性(或接近功能性)语言编译器或解释器必须优化这些琐碎的应用程序案例,因此使用函数应用程序应该是安全的。我将检查V8在这种情况下的性能……哇,我错过了会议室中的大象。这显然与其他功能(运行时检查、评估、无显式编译)有关,但可以说比他们中的任何一个人都更重要。