欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Eval和Apply

程序员文章站 2023-12-21 11:36:16
...
Before we apply a function we must first evaluate its arguments.
这一点常常是编程语言的神秘所在。在SICP的封面,EvalApply是被画作一个阴阳的图案。AlanKay说他可以在一页纸上写出最强大的编程语言,主要说的也是Eval和Apply。

如果你觉得简单就是美,你完全可以定义一个图灵完备的语言,仅仅通过一个数组和“减1,然后跳转”这点东西。但是我们的目标是做一个有用的语言。
SmallTalk是有用的,跟Kay想的差不多。Lisp也是一样。

当然,使用惰性求值,你可以在参数用到的时候才去计算他。
下面是著名的那一对了

可以用一句话来描述:表达式在环境中的求值被归约到过程对实际参数的应用,而这种应用又被归约到新的表达式在新的环境中求值,如此下去,直至我们下降到符号(其值可以在环境中找到)或者基本过程(我们可以直接应用)。

define eval(expr, environment):
   if is_literal(expr): return literal_value(expr)
   if is_symbol(expr):  return lookup_symbol(expr, environment)
   ;; other similar cases here
   ;; remaining (and commonest) case: function application
   function  = extract_function(expr)
   arguments = extract_arguments(expr)
   apply(eval(function, environment), eval_list(arguments, environment))

 define apply(function, arguments):
   if is_primitive(function): return apply_primitive(function, arguments)
   environment = augment(function_environment(function),
                         formal_args(function), arguments)
   return eval(function_body(function), environment)

 def eval_list(items, environment):
   return map( { x -> eval(x, environment) }, items)


有一点比较有意思,上面的代码实现了词法作用域哦。

上一篇:

下一篇: