54 lines
1.6 KiB
Org Mode
54 lines
1.6 KiB
Org Mode
#+title: assorted notes on compilation
|
|
|
|
* letrec
|
|
|
|
consider:
|
|
|
|
#+begin_src scheme
|
|
(letrec ((even? (lambda (n)
|
|
(if (zero? n)
|
|
#t
|
|
(odd? (- n 1)))))
|
|
(odd? (lambda (n)
|
|
(if (zero? n)
|
|
#f
|
|
(even? (- n 1))))))
|
|
(even? 12))
|
|
#+end_src
|
|
|
|
#+RESULTS:
|
|
: #t
|
|
|
|
since ~letrec~ is a primitive construct in the CPS language, the translation of mutually recursive functions is straightforward:
|
|
|
|
#+begin_src scheme
|
|
(define (-& x y k) (k (- x y)))
|
|
(define (zero?& x k) (k (zero? x)))
|
|
(define (halt x) x)
|
|
|
|
(letrec ((even? (lambda (n ktail)
|
|
(zero?& n
|
|
(lambda (x1)
|
|
(if x1
|
|
#t
|
|
(-& n 1
|
|
(lambda (x2)
|
|
(odd? x2 ktail))))))))
|
|
(odd? (lambda (n ktail)
|
|
(zero?& n
|
|
(lambda (x1)
|
|
(if x1
|
|
#f
|
|
(-& n 1
|
|
(lambda (x2)
|
|
(even? x2 ktail)))))))))
|
|
(even? 12 halt))
|
|
#+end_src
|
|
|
|
#+RESULTS:
|
|
: #t
|
|
|
|
however, Scheme permits ~letrec~-expressions with non-lambda right-hand sides, while the CPS language permits only kappa and lambda forms. thus, the handling of these forms is less trivial.
|
|
|
|
for now we'll just reject any ~letrec~ forms with non-lambda right-hand sides, lol. they aren't very important.
|