基于SICP书上求值器的工作


教科书相关章节: 4.1

本项目希望你基于书上4.1节的求值器代码做工作。这一项目可以在PLT Scheme里完成,包括:
  1. 收集书上基本求值器的代码,将其放入一个文件(例如 beval.scm),修改这一文件使之可以在 PLT Scheme 的 R5RS 语言里运行。为此你需要加入一个 error 过程定义,加入逻辑变量 true 和 false 的定义,将 eval 和 apply 函数改名(统一修改为 meval 和 mapply),将使用 apply-in-underlying-scheme 的地方改为直接使用 Scheme 系统的 apply。另外需要把建立全局环境的表达式放在最后,最后启动 driver-loop。
  2. 扩充这个已经能使用的求值器,加入 and 和 or (练习4.4,自己确定一种方式。由于基本系统不支持过程具有可变个数的参数,你可以考虑只支持 2 个参数的 and 和 or,也可以考虑如何扩充系统,使之能支持变动参数个数的过程),并完成练习 4.6、4.7、4.8 提出的工作。
  3. 给求值器加入对更多基本操作的支持,包括几个基本算术运算。考虑练习 4.14 提出的问题,在报告里说明为什么 Louis 的做法失败了。如果可能,请提出你的方法并设法实现(加入 map 的工作作为大作业的可选项)。
  4. 修改得到的求值器,按 4.1.6 节提出的方法将内部过程都扫描出来。
  5. 按照 4.1.7 节的内容,在前面求值器的基础上实现分析求值器(请先拷贝一份代码,建立文件 analyze.scm,在这个文件里修改),保证它能够正确运行。
  6. 给两个求值器增加计时功能,让每次求值不仅给出结果,还输出求值所用的时间。
  7. 做几个程序实例,比较两个求值器的效率。包括线型迭代的 fib,树型递归的 fib,以及另一个你自己选择的实例。用不同参数做实验并报告你的结果。
  8. 做一些你认为有趣的扩充和修改(请参考书上提出的问题,自由发挥,应在报告中特别说明)。
所有基本代码都可以在书上找到。报告中说明你所作工作,想法和试验结果等等。