为什么应用对于lisp评估者来说如此重要?

Tho*_*son 4 lisp sicp

我已经阅读了SICP的第4章,并且发现第一部分列出了实现评估者的最重要的功能,eval而且apply,我知道这eval非常重要,但为什么apply如此重要?对于某些语言,apply在Javascript中完全没有.

编辑:抱歉,我错了Javascript中没有申请,请忽略它.

Eli*_*lay 6

SICP(和其他地方)中的eval/apply事物将评估者的两个主要部分分开.第一部分,即eval正在进行的部分,正在处理代码的语法翻译到其含义 - 但除了调度表达式类型之外,它几乎没有做任何事情.正如你在书中看到的那样eval-foo,各种各样的"特殊形式" 有各种各样的特殊形式,因为它们每个都有自己独特的评价规则.

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

作为旁注,有些人将此与applyScheme和Lisp实现所具有的内置函数相混淆.为什么该功能需要在语言是完全无关的SICP点(大致,它提供了你不能没有它实现功能,它是从实现反射的形式进入语言).我甚至不认为SICP评估员甚至以apply解释语言提供.如果你正在寻找更多的启示,那么(采用SICP元循环评估器,并添加apply解释语言)将是一个很好的反思练习.