用Lisp解释Lisp

最近在读《The Little Schemer》,一到七章都还好,到第八章就开始云里雾里了。书读不透,那么看代码吧。好在已经有了把示例都整理好了。那么开始吧。

我们期望能写出一个能对任意表达式求值的函数,一般叫它eval。不过,这里为了强调是我们自己的求值函数,叫它value

我们先来看两个求值过程:

求值过程

 

求值过程

我们不禁要问,这么多函数是必要的吗?它们起什么作用?

显然,value是个入口函数,因为它只用到了一次。

meaning需要一个表达式和一张记录变量名和其值的对照表(上下文环境)。这就引出一个问题,什么时候改写对照表?(*application)

接着,由expression-to-action判断表达式是否为原子(atom),是的话交给atom-to-action(如果是数字、真假、cons, car, cdr, null?, eq?, atom?, zero?, add1, sub1, number?,就交给*const;其他交给*identifier);否则交给list-to-action

函数分为内置函数(primitive)和自定义函数(non-primitive)两类。语言规定了内置函数的行为,但对于自定义函数,我们只能在运行时确定,所以需要在定义时把它们的相关信息(如:参数、函数体)写进对照表。

它们分别是这么存储的:

(primitive primitive-name)

(non-primitive (table formals body)) (上下文 形参 函数体)

如,

 

对照表的内容是

((( y  z)

  ((8) 9)))

那么,解释器内部是这么存储的:

记录

其中,list (table formals body)叫做closure record.

list-to-action将quote, lambda, cond之外函数交由*application处理。*application对函数和参数列表分别进行处理,按函数类型将primitive交给apply-primitive,而将non-primitive交给apply-closure处理。

evlis对list中的各个元素依次求值,把结果合成一个list返回。

 

evcon用于对cond求值。

剩下的各位还是看书吧^_^

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值