calc_eval
这是一个“计算运算”的函数,需要做很多的判断
首先,判断 exp 的类型:
- 当 exp 是 Pair 类时,通过 first、rest 方法把算子、计算数给分开,以备后续的运算
接下来时判断算子的类型:add、define 等等,做出对应的 eval 运算
- 当 exp 在算子列表之中时(这个算子的列表提前已经写好):直接返回exp 对应的运算函数
- 当 exp 是 int 或者 bool 型时,直接返回
- 如果 exp 在 binding 这个字典之中(通过后续的 define 进行绑定)时:返回对应的绑定好的值
这里的 calc_apply 其实就是“执行运算”的一个函数,把 op 这个运算函数套在 args 的外面
floor_div
这里的 floor 其实时上面提到的已定义的算子中的一个,现在需要自己完成详细信息
首先会接收一串表达式,需要先进行分段
根据上面的例子可以看出,首先要提取出 pair.first,这个是被除数
剩下的 pair.rest 的部分包含了一串除数组成的链表
通过判断 divide 是否为空然后遍历
eval_and
这是一个判断 and 语句真值的函数
给出起始值:exp 为 expression,result 也就是最终的结果默认为 true
接着继开始遍历,根据 and 的逻辑判断原则,只要有一个假,则最终为假,所以约到 scheme_f 后直接返回 false
eval_define
这里给出了一个 bindings,是一个字典。通过 first、rest 对 expression 分段,进行键值对的绑定,记录在 bindings 中
然而这里根据实例可以看出,对于 define 的语句,后面跟的是一个 Pair(value,nil),所以这里直接通过 rest 来取得 value ,然后绑定即可