对于定义
;;; 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
。