boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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)