(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
(test 0 (p))
он переходит в бесконечный цикл, заставляя меня думать, что «если» использует оценку аппликативного порядка. Так где я не прав?
(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
(test 0 (p))
он переходит в бесконечный цикл, заставляя меня думать, что «если» использует оценку аппликативного порядка. Так где я не прав?
Что происходит, так это то, что if
никогда не достигается: именно из-за аппликативного порядка оценки оба аргумента для test
оцениваются до фактического вызова test
, и выражение (p)
будет зацикливаться навсегда.
Если бы та же процедура оценивалась в обычном порядке, она вернула бы ноль, что этот пример и пытается продемонстрировать в первую очередь.
Используя DrRacket с директивой схемы #lang в первой строке, я пробовал так...
;say "hi" to Ben Bitdiddle
(define (q) (display "Hello?...Ben?)
(define (test x y)
(if (= x 0)
0
y))
Затем я воспользовался инструментом отладки DrRacket 5.3, чтобы пройти оценку.
Очевидно, что это оценка аппликативного порядка.
Окно Eval показывает -> Привет? ... Бен? за которым следует 0, потому что DrRacket оценивает вызов (q) перед вводом «если».