对于定义
.. literalinclude:: code/34-f.scm
执行表达式 (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
。