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)


有一点比较有意思,上面的代码实现了词法作用域哦。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值