diff options
author | Andy Wingo <wingo@pobox.com> | 2009-10-16 15:27:10 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2009-10-16 15:33:32 +0200 |
commit | f95f82f8e183f2744740bdc950dba9c856e09094 (patch) | |
tree | dae9d13d354a09c516245ec25e2f03aac5eecb30 /module/language/tree-il/analyze.scm | |
parent | 40867c9776de71b0a822e15234711f5259df76aa (diff) | |
download | guile-f95f82f8e183f2744740bdc950dba9c856e09094.tar.gz |
compilation enviroments are always modules; simplifications & refactorings
* module/ice-9/boot-9.scm (make-fresh-user-module): New public function,
makes an anonymous beautified module.
* module/language/objcode/spec.scm: We used to have some things in here
that allowed lexical variable names and values to be a part of the
environment, but no more. Now an environment is just a module. If you
want to "inject" free variables into code, just use lambda.
* module/language/scheme/compile-tree-il.scm (compile-tree-il): Same
here. Also, rely on the fact that an environment *will* be a module --
because (system base compile) guarantees that for us.
* module/language/scheme/spec.scm (scheme): In the reader, rely on the
environment being a module. Define a #:make-default-environment
handler, which returns a beautified module, augmented with a fresh
definition for current-reader, so that side effects to current-reader
are restricted to the compilation unit.
* module/language/tree-il/analyze.scm
(report-possibly-unbound-variables):
* module/language/tree-il/compile-glil.scm (compile-glil):
* module/language/tree-il/optimize.scm (optimize!): The environment will
be a module.
* module/system/base/language.scm (<language>): New field,
`make-default-environment'. Defaults to `make-fresh-user-module'.
(default-environment): New accessor, returns a default environment for
a language.
* module/system/repl/common.scm (repl-compile): Always compile relative
to the current module, because a module is always acceptable as an
environment.
* module/system/base/compile.scm (compile-file, compile-and-load): Both
of these have a new keyword argument, #:env. For `compile-file', it
defaults to the default environment of the source language, and for
`compile-and-load', to the current module.
(read-and-compile): If there are no expressions read, pass the joiner
its default environment (via `default-environment joint').
Diffstat (limited to 'module/language/tree-il/analyze.scm')
-rw-r--r-- | module/language/tree-il/analyze.scm | 119 |
1 files changed, 55 insertions, 64 deletions
diff --git a/module/language/tree-il/analyze.scm b/module/language/tree-il/analyze.scm index 46e467791..42ad74d7d 100644 --- a/module/language/tree-il/analyze.scm +++ b/module/language/tree-il/analyze.scm @@ -633,76 +633,67 @@ (defs toplevel-info-defs) ;; (VARIABLE-NAME ...) (locs toplevel-info-locs)) ;; (LOCATION ...) -(define (env-module e) - "Return the module corresponding to E." - ;; XXX: This is a bit of a hack since since representation of compile-time - ;; environments is hidden in `(language scheme compile-tree-il)'. - (cond ((pair? e) (car e)) - ((module? e) e) - (else (current-module)))) - ;; TODO: Combine with `report-unused-variables' so we don't traverse the tree ;; once for each warning type. (define (report-possibly-unbound-variables tree env) "Return possibly unbound variables in TREE. Return TREE." (define toplevel - (let ((env (env-module env))) - (tree-il-fold (lambda (x info) - ;; X is a leaf: extend INFO's refs accordingly. - (let ((refs (toplevel-info-refs info)) - (defs (toplevel-info-defs info)) - (locs (toplevel-info-locs info))) - (define (bound? name) - (or (and (module? env) - (module-variable env name)) - (memq name defs))) - - (record-case x - ((<toplevel-ref> name src) - (if (bound? name) - info - (let ((src (or src (find pair? locs)))) - (make-toplevel-info (alist-cons name src refs) - defs - locs)))) - (else info)))) - - (lambda (x info) - ;; Going down into X. - (let* ((refs (toplevel-info-refs info)) - (defs (toplevel-info-defs info)) - (src (tree-il-src x)) - (locs (cons src (toplevel-info-locs info)))) - (define (bound? name) - (or (and (module? env) - (module-variable env name)) - (memq name defs))) - - (record-case x - ((<toplevel-set> name src) - (if (bound? name) - (make-toplevel-info refs defs locs) - (let ((src (find pair? locs))) - (make-toplevel-info (alist-cons name src refs) - defs - locs)))) - ((<toplevel-define> name) - (make-toplevel-info (alist-delete name refs eq?) - (cons name defs) - locs)) - (else - (make-toplevel-info refs defs locs))))) - - (lambda (x info) - ;; Leaving X's scope. - (let ((refs (toplevel-info-refs info)) - (defs (toplevel-info-defs info)) - (locs (toplevel-info-locs info))) - (make-toplevel-info refs defs (cdr locs)))) - - (make-toplevel-info '() '() '()) - tree))) + (tree-il-fold (lambda (x info) + ;; X is a leaf: extend INFO's refs accordingly. + (let ((refs (toplevel-info-refs info)) + (defs (toplevel-info-defs info)) + (locs (toplevel-info-locs info))) + (define (bound? name) + (or (and (module? env) + (module-variable env name)) + (memq name defs))) + + (record-case x + ((<toplevel-ref> name src) + (if (bound? name) + info + (let ((src (or src (find pair? locs)))) + (make-toplevel-info (alist-cons name src refs) + defs + locs)))) + (else info)))) + + (lambda (x info) + ;; Going down into X. + (let* ((refs (toplevel-info-refs info)) + (defs (toplevel-info-defs info)) + (src (tree-il-src x)) + (locs (cons src (toplevel-info-locs info)))) + (define (bound? name) + (or (and (module? env) + (module-variable env name)) + (memq name defs))) + + (record-case x + ((<toplevel-set> name src) + (if (bound? name) + (make-toplevel-info refs defs locs) + (let ((src (find pair? locs))) + (make-toplevel-info (alist-cons name src refs) + defs + locs)))) + ((<toplevel-define> name) + (make-toplevel-info (alist-delete name refs eq?) + (cons name defs) + locs)) + (else + (make-toplevel-info refs defs locs))))) + + (lambda (x info) + ;; Leaving X's scope. + (let ((refs (toplevel-info-refs info)) + (defs (toplevel-info-defs info)) + (locs (toplevel-info-locs info))) + (make-toplevel-info refs defs (cdr locs)))) + + (make-toplevel-info '() '() '()) + tree)) (for-each (lambda (name+loc) (let ((name (car name+loc)) |