第 11 课作业

第 11 课课后作业:SICP 第 4 章练习与为元循环求值器添加形参类型检查功能。

练习 0

几道热身题,检验你的理解:

  • 列出元循环求值器中所有调用了 mc-eval 的过程。
  • 列出元循环求值器中所有调用了 mc-apply 的过程。
  • 解释为什么 make-procedure 不调用 mc-eval。

关于第 11 课作业的说明

有同学反映本周的作业非常耗时。

因此,我们略带犹豫地把几道练习标记为选做;时间实在紧张的话,这些可以跳过。但最好还是全部做完!

选做的练习旁边标有 *。

模板

你可以在终端中输入以下命令来复制本次作业的模板:

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

或者,你可以从这里下载。

练习 1

Abelson & Sussman,习题 4.3、4.6、4.7、4.10、4.11*、4.13、4.14 和 4.15。

练习 4

Abelson & Sussman,习题 4.1、4.2、4.4 和 4.5。

练习 2*

修改元循环求值器,使其支持对过程实参的类型检查。功能如下。定义新过程时,形参可以像往常一样是一个符号,也可以是一个含两个元素的表。在后一种情况下,第二个元素是符号,即形参的名字;第一个元素是一个表达式,其值是一个谓词函数,实参必须满足它。如果实参合法,该函数应返回 #t。例如,下面是一个拥有经类型检查的形参 num 和 lst 的过程 foo:

> (define (foo (integer? num) ((lambda (x) (not (null? x))) lst))
    (list-ref lst num))
> (foo 3 '(a b c d e))
d
> (foo 3.5 `(a b c d e))
Error: wrong argument type -- 3.5
> (foo 2 '())
Error: wrong argument type -- ()

在这个例子中,我们定义了有两个形参的过程 foo,分别名为 num 和 lst。调用 foo 时,求值器会检查第一个实参是否为整数,第二个实参是否非空。其值为所需谓词函数的那个表达式,应在 foo 的定义环境中求值。(提示:想想 extend-environment。)

更多挑战题

如果你对本小节感兴趣,这里还有更多选做练习。这些练习不计分。

提交作业!

相关说明请参阅这份指南。其中涵盖基本的终端命令和作业提交流程。

提交过程中如有任何困难,请随时向助教提问!