练习 1.34

对于定义

;;; 34-f.scm

(define (f g)
    (g 2))

执行表达式 (f f) 会造成错误:

1 ]=> (load "34-f.scm")

;Loading "34-f.scm"... done
;Value: f

1 ]=> (f f)

;The object 2 is not applicable.
;To continue, call RESTART with an option number:
; (RESTART 2) => Specify a procedure to use in its place.
; (RESTART 1) => Return to read-eval-print level 1.

要了解出错的原因,我们展开 (f f) 的执行过程:

(f f)

(f (lambda (g)
       (g 2)))

((lambda (g)
     (g 2))
 (lambda (g)
     (g 2)))

((lambda (g)
    (g 2))
 2)

(2 2)

执行到 (2 2) 这一步时,解释器试图以 2 作为函数进行调用,但是 2 并不是一个函数,所以执行出错并打印信息: The object 2 is not applicable

讨论

blog comments powered by Disqus