2011-06-07 38 views
4

我已阅读SICP第4章,刚发现第一部分列出了实现评估者的最重要功能,evalapply,据我所知eval非常重要,但为什么apply如此重要?对于某些语言,在Javascript中完全没有apply为什么申请对lisp评估者如此重要?

编辑:对不起,我错了,没有适用于Javascript,请忽略。

+0

我确定JavaScript中有一些等价物:) – leppie 2011-06-07 16:16:56

+0

JavaScript *确实有'apply',不是吗?我不是JS专家,但https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Apply – spacemanaki 2011-06-08 14:46:18

回答

6

SICP(和别处)中的eval/apply事件将评估者的两个主要部分分开。第一部分,eval正在做的一件事是处理代码的语法翻译以达到它的意义 - 但除了调度表达式类型之外,它几乎没有做任何事情。正如您在书中看到的那样,各种“特殊形式”有各种各样的eval-foo,因为它们每个都有其独特的评估规则。

现在,评估者需要处理的最重要的形式是功能应用。事实上,这个表单中没有关键字非常重要(否则,你会看到apply或任何乱抛垃圾方案/ lisp代码)。相反,如果一个表单以某种不是已知特殊形式的东西开始(并且在实际实现中,而不是已知的宏),那么评估者将其视为一个函数应用程序。此时,要评估函数调用,您需要评估函数本身(第一个表格)及其所有参数,然后您需要应用第一个值。这里主要的启发时刻是认识到这个evalapply之间存在主要区别 - 前者固有地处理语法,但后者处理

作为一个便笺,有几个人将此与Scheme和Lisp实现具有的内置apply函数混淆。为什么这个函数需要使用语言,与SICP的观点完全无关(粗略地说,它提供了不具备它的功能,它是从实现到语言的一种反射形式)。我甚至不认为SICP评估者甚至可以用解释型语言提供apply。如果你正在寻找更多的启发,那么做到这一点(以SICP元圆形评估者的身份,并将apply添加到的解释语言)将是一个很好的反思练习。

1

应用评估函数调用。它需要一个函数和一个参数列表:(apply fn args)。如果您的语言支持函数调用,那么您可能会在解释器中使用apply函数。 Scheme和Javascript的不同之处在于Scheme不仅向解释器展示了这个函数,而且还向解释为的程序展示了这个函数。

+0

在这种情况下,“评估”具有特定的含义,因此此解释不是帮助很大。更重要的是,你正在谈论“apply”函数,以及这与本书所讨论的应用程序有什么关系,这是一个更加微妙的问题。 – 2011-06-07 17:12:12

+0

这是一个微妙的问题,但在我看来,OP正在询问确切的问题,因为他提到JS没有应用函数。 eval函数对表达式类型执行案例分析,然后每个案例决定如何评估该类型的表达式。 SICP中的评估者恰好将用于评估函数调用的代码分解为称为apply的另一个函数。这不是评估者的基本特征:您可以将应用函数内联到eval中,尽管这可能会使代码不太清晰。 – Jules 2011-06-07 18:17:17

+0

解释器中的apply函数和apply函数之间的区别实际上并不大。通过将apply函数放入您的原始程序列表中,可以将apply函数直接暴露给用户程序。 – Jules 2011-06-07 18:18:55