2016/01/03

SICP 問題 4.25

;; 作用的順序のschemeで本文中のunlessを使用してfactorialを定義した時,  
``(factorial 5)``を評価しようとすると何が起きるか.
(define (unless condition usual-value exceptional-value)
  (if condition exceptional-value usual-value))

(define (factorial n)
  (unless (= n 1)
    (* n (factorial (- n 1)))
    1))

;; 作用的順序なのでまず引数を評価しようとする.
(unless (= n 1) (* n (factorial (- n 1)) 1)
;; を評価する時に(factorial (- n 1))の部分でループになる.

;; 正規順序の言語では引数は必要になった時に初めて評価されるのでこの問題は起こらない.

© 2022 wat-aro