乐正

Actions speak louder than words.

Sicp-ex4-2

问题

Louis Reasoner 计划重新安排evalcond子句的位置,使得有关过程应用的字句出现在有关赋值的子句之前。他的论断是,这样做将会提高求值器的效率:因为程序里通常包含的函数应用比赋值和定义等等更多一些,而经他的修改之后,eval为确定一个表达式的类型所需检查的子句将会比原来的eval更少一些。

a) Louis 的计划有什么错?(提示:Louis 的求值器将如何处理表达式(define x 3)
b) Louis 因为其计划无法工作而感到非常沮丧。他希望,无论要走多远也要让自己的求值器在检查大部分表达式之前就可以识别出过程应用。请设法帮助他,修改被求值语言的语法,使得每个过程应用都以call开始。例如现在我们不是直接写(factorial 3),而是需要写(call factorial 3);不能直接写(+ 1 2),而是必须写(call + 1 2)

解答

a) 因为赋值、定义等等其他的语法也可以被看做是过程应用的语法。所以,如果直接按照 Louis 的去做,那么将无法正常的解析。

b) application? 等相关的函数修改如下:

1
2
3
4
5
(define (application? exp) (tagged-list? exp 'call))

(define (operator exp) (cadr exp))

(define (operands exp) (cddr exp))

draft

« sicp-ex4-1 sicp-ex4-3 »

Comments