首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Eval跟Apply

2012-12-25 
Eval和ApplyBefore we apply a function we must first evaluate its arguments.这一点常常是编程语言的神

Eval和Apply
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)


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

热点排行