020-letrec.scm (963B)
1 ; letrec / letrec*: local recursive bindings. letrec* is an alias of 2 ; letrec in scheme1 (eval_letrec already evaluates inits left-to-right); 3 ; the R7RS guarantee letrec* adds — later inits may reference earlier 4 ; ones — is exercised below. 5 6 ;; --- letrec: classic recursive factorial --------------------------- 7 (if (= 120 (letrec ((fact (lambda (n) 8 (if (= n 0) 1 (* n (fact (- n 1))))))) 9 (fact 5))) 10 0 (sys-exit 1)) 11 12 ;; --- letrec* accepts the same shape and value --------------------- 13 (if (= 120 (letrec* ((fact (lambda (n) 14 (if (= n 0) 1 (* n (fact (- n 1))))))) 15 (fact 5))) 16 0 (sys-exit 2)) 17 18 ;; --- letrec*: later inits reference earlier ones ------------------- 19 ;; y depends on x; z depends on both. + is 2-arg in scheme1, so each 20 ;; init uses pairwise sums. 21 (if (= 6 (letrec* ((x 1) (y (+ x 2)) (z (+ y x))) 22 (+ z 2))) 23 0 (sys-exit 3)) 24 25 (sys-exit 4)