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也是一样。
当然,使用惰性求值,你可以在参数用到的时候才去计算他。
下面是著名的那一对了
可以用一句话来描述:表达式在环境中的求值被归约到过程对实际参数的应用,而这种应用又被归约到新的表达式在新的环境中求值,如此下去,直至我们下降到符号(其值可以在环境中找到)或者基本过程(我们可以直接应用)。
有一点比较有意思,上面的代码实现了词法作用域哦。
这一点常常是编程语言的神秘所在。在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)
有一点比较有意思,上面的代码实现了词法作用域哦。