Next: compiler lifting prerequisites, Up: compiler lifting [Index]
clambda
liftingThe purpose of this compiler pass is to partition the input expression into: the code that will be compiled to code objects implementing closure objects; code that will be compiled to a code object implementing the main body of the expression. As example, the library:
(library (clambda-lifting-demo-0) (export a b c d) (import (rnrs)) (define (a) '1) (define (b) '2) (define (c) '3) (define d 4))
is expanded into:
(library-letrec* ((a a.loc (lambda () '1)) (b b.loc (lambda () '2)) (c c.loc (lambda () '3)) (d d.loc '4)) (quote #!void))
before this compiler pass it is transformed into:
(fix ((a_0 (closure-maker (lambda () (constant 1)) no-freevars)) (b_0 (closure-maker (lambda () (constant 2)) no-freevars)) (c_0 (closure-maker (lambda () (constant 3)) no-freevars))) (seq (funcall (primref $set-symbol-value/proc!) (constant a.loc) a_0) (funcall (primref $init-symbol-value!) (constant b.loc) b_0) (funcall (primref $init-symbol-value!) (constant c.loc) c_0) (bind ((d_0 (constant 4))) (seq (funcall (primref $init-symbol-value!) (constant d.loc) d_0) (constant #!void)))))
and after this compiler pass it will become:
(codes ((lambda (label: asmlabel:c:clambda) () (constant 3)) (lambda (label: asmlabel:b:clambda) () (constant 2)) (lambda (label: asmlabel:a:clambda) () (constant 1))) (seq (funcall (primref $set-symbol-value/proc!) (constant a.loc) (closure-maker (code-loc asmlabel:a:clambda) no-freevars)) (funcall (primref $init-symbol-value!) (constant b.loc) (closure-maker (code-loc asmlabel:b:clambda) no-freevars)) (funcall (primref $init-symbol-value!) (constant c.loc) (closure-maker (code-loc asmlabel:c:clambda) no-freevars)) (bind ((d_0 (constant 4))) (seq (funcall (primref $init-symbol-value!) (constant d.loc) d_0) (constant #!void)))))
We see the result of the transformation is a struct of type
codes
in which the clambda
forms have been extracted
and separated; in addition, the top level fix
struct has been
removed and references to the fix
bindings have been replaced
by closure-maker
forms, this happens because all the functions
are combinators.
The closure-maker
form:
(closure-maker (code-loc asmlabel:a:clambda) no-freevars)
will be compiled to code that returns a closure object implementing the
function a
, with assembly entry point label
asmlabel:a:clambda
.
Next: compiler lifting prerequisites, Up: compiler lifting [Index]