我得到了这个程序:
(define a 2)
(define (goo x)
(display x) (newline)
(lambda (y) (/ x y)))
(define (foo x)
(let ((f (goo a)))
(if (= x 0)
x
(f x))))
我要求比较表达式(foo (foo 0))
上的适用顺序和正常顺序之间的评估结果。
据我所知,按照应用顺序,功能(display x)
中的goo
将打印x
,之后程序将崩溃,因为y
未定义。但是当我在Scheme中运行时,没有任何事情发生。是什么原因?
答案 0 :(得分:2)
(foo 0)
评估此代码:
(define (goo 2)
(display 2) (newline)
(lambda (y) (/ 2 y)))
(define (foo x)
(let ((f (goo 2)))
(if (= 0 0)
0
((lambda (y) (/ 2 y)) 0))))
并打印2
,返回0
。虽然(foo 4)
评估为:
(define (goo 2)
(display 2) (newline)
(lambda (y) (/ 2 y)))
(define (foo 4)
(let ((f (goo 2)))
(if (= 4 0)
4
((lambda (y) (/ 2 y)) 4))))
并打印2
,返回0.5
。