作业 8

第 8 课的作业:完成 SICP 3.3、3.4、3.7、3.8、3.10、3.11 等习题,另有可选的 unique-rename 挑战题。

模板

在终端输入下面的命令,把模板文件拷贝到当前目录:

cp ~cs61as/autograder/templates/hw8.scm .

你也可以从这里下载。

习题

请完成以下题目:

注意: 做习题 3.3 和 3.4 时,你应该创建名为 make-password-account 的函数,而不是 make-account。

学有余力(选做)

想做就做。不计分。

环境模型的目的是表示变量的作用域:当你在程序里看到一个 x 时,它指的是哪个变量 x?解决这个问题的另一种办法是:把所有局部变量重新命名,使命名永不重复。请写一个过程 unique-rename,它接受一个(带引号的)lambda 表达式作为参数,返回一个等价的 lambda 表达式,其中变量都被重命名为唯一的名字:

> (unique-rename '(lambda (x) (lambda (y) (x (lambda (x) (y x))))))
(lambda (g1) (lambda (g2) (g1 (lambda (g3) (g2 g3)))))

注意,原表达式里有两个名为 x 的变量,而在返回的表达式里,从名字就能看出哪个是哪个。你需要一个修改过的计数器对象来生成这些唯一的名字。

你可以假设不存在 quote、let、define 表达式,因此每个符号都是变量引用,变量只由 lambda 创建。

请描述你会如何利用 unique-rename,让 Scheme 程序的求值只需要一个(全局)框架。

提交作业!

提交说明见这份指南。它涵盖基本终端命令和作业提交方法。

提交时如有任何困难,不要犹豫,尽管问助教!