第 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。)
更多挑战题
如果你对本小节感兴趣,这里还有更多选做练习。这些练习不计分。
- Abelson & Sussman,习题 4.16 - 4.21。
提交作业!
相关说明请参阅这份指南。其中涵盖基本的终端命令和作业提交流程。
提交过程中如有任何困难,请随时向助教提问!