* split the library expander into a core-library-expander
and two expanders: one for boot and one for runtime
This commit is contained in:
parent
4c4af70ffc
commit
1fdce919d7
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
|
@ -1841,19 +1841,18 @@
|
|||
r mr lhs* lex* rhs* kwd*)]
|
||||
[else (return e* r mr lhs* lex* rhs* kwd*)]))))]))))))
|
||||
(define chi-library-internal
|
||||
(lambda (e* r rib kwd*)
|
||||
(lambda (e* rib kwd*)
|
||||
(define return
|
||||
(lambda (init* module-init** r mr lhs* lex* rhs*)
|
||||
(let ([module-init* (apply append (reverse module-init**))])
|
||||
(values (append module-init* init*)
|
||||
r mr (reverse lex*) (reverse rhs*)))))
|
||||
(let f ([e* e*] [module-init** '()] [r r] [mr r]
|
||||
(let f ([e* e*] [module-init** '()] [r '()] [mr '()]
|
||||
[lhs* '()] [lex* '()] [rhs* '()] [kwd* kwd*])
|
||||
(cond
|
||||
[(null? e*) (return e* module-init** r mr lhs* lex* rhs*)]
|
||||
[else
|
||||
(let ([e (car e*)])
|
||||
;(printf "chi ~s\n" e)
|
||||
(let-values ([(type value kwd) (syntax-type e r)])
|
||||
(let ([kwd* (cons-id kwd kwd*)])
|
||||
(case type
|
||||
|
@ -1966,7 +1965,20 @@
|
|||
(extend-rib! rib (stx name top-mark* '()) label)))
|
||||
subst)
|
||||
rib))
|
||||
(define library-expander
|
||||
(define (make-collector)
|
||||
(let ([ls '()])
|
||||
(case-lambda
|
||||
[() ls]
|
||||
[(x) (set! ls (set-cons x ls))])))
|
||||
(define run-collector
|
||||
(make-parameter
|
||||
(lambda args
|
||||
(error 'run-collector "not initialized"))
|
||||
(lambda (x)
|
||||
(unless (procedure? x)
|
||||
(error 'run-collector "~s is not a procedure" x))
|
||||
x)))
|
||||
(define core-library-expander
|
||||
(lambda (e)
|
||||
(let-values ([(name exp* imp* b*) (parse-library e)])
|
||||
(let-values ([(subst lib*) (get-import-subst/libs imp*)])
|
||||
|
@ -1975,23 +1987,7 @@
|
|||
[kwd* (map (lambda (sym mark*) (stx sym mark* (list rib)))
|
||||
(rib-sym* rib) (rib-mark** rib))])
|
||||
(let-values ([(init* r mr lex* rhs*)
|
||||
(chi-library-internal b* '() rib kwd*)])
|
||||
(let ([rhs* (chi-rhs* rhs* r mr)])
|
||||
(let ([body (if (null? init*)
|
||||
(build-void)
|
||||
(build-sequence no-source
|
||||
(chi-expr* init* r mr)))])
|
||||
(build-letrec no-source lex* rhs* body))))))))))
|
||||
(define boot-library-expander
|
||||
(lambda (e)
|
||||
(let-values ([(name exp* imp* b*) (parse-library e)])
|
||||
(let-values ([(subst lib*) (get-import-subst/libs imp*)])
|
||||
(let ([rib (make-top-rib subst)])
|
||||
(let ([b* (map (lambda (x) (stx x top-mark* (list rib))) b*)]
|
||||
[kwd* (map (lambda (sym mark*) (stx sym mark* (list rib)))
|
||||
(rib-sym* rib) (rib-mark** rib))])
|
||||
(let-values ([(init* r mr lex* rhs*)
|
||||
(chi-library-internal b* '() rib kwd*)])
|
||||
(chi-library-internal b* rib kwd*)])
|
||||
(let ([rhs* (chi-rhs* rhs* r mr)])
|
||||
(let ([body (if (and (null? init*) (null? lex*))
|
||||
(build-void)
|
||||
|
@ -2000,8 +1996,21 @@
|
|||
(map build-export lex*)
|
||||
(chi-expr* init* r mr))))])
|
||||
(values
|
||||
name
|
||||
(build-letrec no-source lex* rhs* body)
|
||||
(map (find-export rib r) exp*)))))))))))
|
||||
(define library-expander
|
||||
(lambda (x)
|
||||
(let ([rtc (make-collector)])
|
||||
(parameterize ([run-collector rtc])
|
||||
(let-values ([(name invoke-code export-subst)
|
||||
(core-library-expander x)])
|
||||
invoke-code)))))
|
||||
(define boot-library-expander
|
||||
(lambda (x)
|
||||
(let-values ([(name invoke-code exp*)
|
||||
(core-library-expander x)])
|
||||
(values invoke-code exp*))))
|
||||
(define build-export
|
||||
(lambda (x)
|
||||
;;; exports use the same gensym
|
||||
|
|
Loading…
Reference in New Issue