我一直在玩The Little Schemer,并在我工作的过程中尝试想法(并非所有想法都在工作)。刚才,我在第 6 章(他们在其中介绍了辅助函数),我觉得这一步触手可及——我只是不知道如何迈出这一步。
书中的代码如下:
(define (^ b e) (expt b e))
(define (x a b) (* a b))
(define value-i
(lambda (nexp)
(cond
((atom? nexp) nexp)
((eq? (car (cdr nexp)) '+) (+ (car nexp) (value-i (caddr nexp))))
((eq? (car (cdr nexp)) 'x) (x (car nexp) (value-i (caddr nexp))))
(else
(^ (car nexp) (value-i (caddr nexp))))
)))
定义了以下助手:
(define (operator-i aexp) (car (cdr aexp)))
(define (firstSubExp-i aexp) (car aexp))
(define (secondSubExp aexp) (caddr aexp))
并进行了这种简化:
(define value-i2
(lambda (nexp)
(cond
((atom? nexp) nexp)
((eq? (operator-i nexp) '+) (+ (firstSubExp-i nexp)
(value-i2 (secondSubExp nexp))))
((eq? (operator-i nexp) 'x) (x (firstSubExp-i nexp)
(value-i2 (secondSubExp nexp))))
(else
(eq? (operator-i nexp) '^) (^ (firstSubExp-i nexp)
(value-i2 (secondSubExp nexp))))
)))
我认为我可以看到的简化是,当我们假设所有内容nexp
都是有效的时,我们不需要重复((eq? (operator-i nexp) ...
样板文件。
像下面这样的东西应该可以工作:
(define value-i3
(lambda (nexp)
(cond
((atom? nexp) nexp)
(else
((operator-i nexp)
(firstSubExp-i nexp)
(value-i3 (secondSubExp nexp))))
)))
...除了它没有。Exception: attempt to apply non-procedure ...
它与(+、x 和 ^ 之一)出错。
我可以看到问题在于它无法识别我正在尝试使用(operator-i nexp)
.
我如何向解释器表明我希望应用我返回的函数(operator-i nexp)
?
也欢迎任何其他提示(我使用的是 petite chez 方案)。