23 lines
No EOL
1.4 KiB
Racket
23 lines
No EOL
1.4 KiB
Racket
#lang sicp
|
|
|
|
;Ben Bitdiddle has invented a test to determine whether the interpreter he is faced with is using applicative-order evaluation or normal-order evaluation. He defines the following two procedures:
|
|
;(define (p) (p))
|
|
;(define (test x y)
|
|
;(if (= x 0) 0 y))
|
|
;Then he evaluates the expression (test 0 (p))
|
|
;What behavior will Ben observe with an interpreter that uses applicative-order evaluation? What behavior will he observe with an interpreter that uses normal-order evaluation? Explain your answer.
|
|
;(Assume that the evaluation rule for the special form if is the same whether the interpreter is using normal or applicative order: The predicate expression is evaluated first, and the result determines whether to evaluate the consequent or the alternative expression.)
|
|
|
|
;--------------------------------------------------------------------------------------------------------------------------
|
|
;Applicative-order evaluation --> evaluates the arguments of a function before applying the function itself.
|
|
;Normal-order evaluation --> evaluates arguments only when they are needed (delay evaluation agrument until they are needed)
|
|
|
|
|
|
(define (p) (p))
|
|
(define (test x y)
|
|
(if (= x 0) 0 y)
|
|
)
|
|
|
|
(test 0 3) ;if x = 0 then return x but if it is not then return y. So that, it is doing what you are asking for --> return x which is 0
|
|
(test 1 3) ;if x != 0 then return y --> return 3
|
|
(test 0 (p)) ;nothing happened// not evaluated yet |