mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 03:30:27 +02:00
allow multiple modules in one compilation unit
* module/system/il/ghil.scm (<ghil-env>, <ghil-toplevel-env>): Refactor so that all environments point (eventually) at one toplevel environment. Instead of having potentially multiple toplevel environments, each noting the module against which its bindings are resolved, have each binding in the toplevel record what module it should be resolved in. Should fix compilation units that define multiple modules. (ghil-lookup, ghil-define): Reworked to not be destructive. Module variables now have the module name as their "env", and are keyed as `(MODNAME . SYM)' in the var table. (call-with-ghil-environment): Reindented. * module/system/il/inline.scm (try-inline-with-env): Adapt to env/toplevel changes. * module/system/vm/assemble.scm (dump-object!): A vlink-later now holds the module name, not the module itself. * module/system/il/compile.scm (make-glil-var): The "env" of a "module" var is now the module name, not the module. * module/language/scheme/translate.scm (primitive-syntax-table): Update the way we test for toplevel environments. Reindent the lambda translator. (lookup-transformer, trans): lookup-transformer now has 2 args, not 3. (translate): Update the way we make toplevel environments.
This commit is contained in:
parent
b5c46470a5
commit
2e7e6969bd
5 changed files with 79 additions and 96 deletions
|
@ -69,22 +69,19 @@
|
|||
(and=> (assq-ref *inline-table* head-value)
|
||||
(lambda (proc) (apply proc args))))
|
||||
|
||||
(define (ghil-env-ref env sym)
|
||||
(assq-ref (ghil-env-table env) sym))
|
||||
|
||||
|
||||
(define (try-inline-with-env env loc exp)
|
||||
(let ((sym (car exp)))
|
||||
(and (not (ghil-env-ref env sym))
|
||||
(let loop ((e (ghil-env-parent env)))
|
||||
(record-case e
|
||||
((<ghil-mod> module table imports)
|
||||
(and (not (assq-ref table sym))
|
||||
(module-bound? module sym)
|
||||
(try-inline (module-ref module sym) (cdr exp))))
|
||||
((<ghil-env> mod parent table variables)
|
||||
(and (not (assq-ref table sym))
|
||||
(loop parent))))))))
|
||||
(let loop ((e env))
|
||||
(record-case e
|
||||
((<ghil-toplevel-env> table)
|
||||
(let ((mod (current-module)))
|
||||
(and (not (assoc-ref table (cons (module-name mod) sym)))
|
||||
(module-bound? mod sym)
|
||||
(try-inline (module-ref mod sym) (cdr exp)))))
|
||||
((<ghil-env> parent table variables)
|
||||
(and (not (assq-ref table sym))
|
||||
(loop parent)))))))
|
||||
|
||||
(define-inline eq? (x y)
|
||||
(eq? x y))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue