正常订单与Scheme中的应用订单

时间:2011-03-20 11:24:34

标签: scheme

我得到了这个程序:

(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中运行时,没有任何事情发生。是什么原因?

1 个答案:

答案 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