~ chicken-core (chicken-5) de3731bd8b0fef528a1d2d0ebfb6af2e65dfa71e
commit de3731bd8b0fef528a1d2d0ebfb6af2e65dfa71e Author: felix <felix@call-with-current-continuation.org> AuthorDate: Wed Apr 13 06:14:45 2011 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Wed Apr 13 06:14:45 2011 -0400 proper environment switching with ,m (reported by ckeen) diff --git a/csi.scm b/csi.scm index 705e6beb..6527e2d3 100644 --- a/csi.scm +++ b/csi.scm @@ -428,7 +428,7 @@ EOF (lambda () (let ((name (read))) (cond ((not name) - (##sys#current-module #f) + (##sys#switch-module #f) (printf "; resetting current module to toplevel~%")) ((string? name) (set! name (##sys#string->symbol name))) @@ -436,7 +436,7 @@ EOF (printf "invalid module name `~a'~%" name)) ((##sys#find-module (##sys#resolve-module-name name #f) #f) => (lambda (m) - (##sys#current-module m) + (##sys#switch-module m) (printf "; switching current module to `~a'~%" name))) (else (printf "undefined module `~a'~%" name)))))) diff --git a/modules.scm b/modules.scm index d60560e2..3c190e77 100644 --- a/modules.scm +++ b/modules.scm @@ -68,12 +68,13 @@ module-meta-import-forms set-module-meta-import-forms! module-exist-list set-module-exist-list! module-meta-expressions set-module-meta-expressions! - module-defined-syntax-list set-module-defined-syntax-list!)) + module-defined-syntax-list set-module-defined-syntax-list! + module-saved-environments set-module-saved-environments!)) (define-record-type module (%make-module name export-list defined-list exist-list defined-syntax-list undefined-list import-forms meta-import-forms meta-expressions - vexports sexports) + vexports sexports saved-environments) module? (name module-name) ; SYMBOL (export-list module-export-list set-module-export-list!) ; (SYMBOL | (SYMBOL ...) ...) @@ -85,7 +86,8 @@ (meta-import-forms module-meta-import-forms set-module-meta-import-forms!) ; (SPEC ...) (meta-expressions module-meta-expressions set-module-meta-expressions!) ; (EXP ...) (vexports module-vexports set-module-vexports!) ; ((SYMBOL . SYMBOL) ...) - (sexports module-sexports set-module-sexports!) ) ; ((SYMBOL SE TRANSFORMER) ...) + (sexports module-sexports set-module-sexports!) ; ((SYMBOL SE TRANSFORMER) ...) + (saved-environments module-saved-environments set-module-saved-environments!)) ; for csi's ",m" command, holds (<env> . <macroenv>) (define ##sys#module-name module-name) @@ -96,7 +98,7 @@ (module-sexports m))) (define (make-module name explist vexports sexports) - (%make-module name explist '() '() '() '() '() '() '() vexports sexports)) + (%make-module name explist '() '() '() '() '() '() '() vexports sexports #f)) (define (##sys#register-module-alias alias name) (##sys#module-alias-environment @@ -124,6 +126,21 @@ (err (error loc "module not found" name)) (else #f))) +(define ##sys#switch-module + (let ((saved-default-envs #f)) + (lambda (mod) + (let ((now (cons (##sys#current-environment) (##sys#macro-environment)))) + (cond ((##sys#current-module) => + (lambda (m) + (set-module-saved-environments! m now))) + (else + (set! saved-default-envs now))) + (let ((saved (if mod (module-saved-environments mod) saved-default-envs))) + (when saved + (##sys#current-environment (car saved)) + (##sys#macro-environment (cdr saved)) + (##sys#current-module mod))))))) + (define (##sys#toplevel-definition-hook sym mod exp val) #f) (define (##sys#register-meta-expression exp) @@ -484,7 +501,11 @@ (VEXPORTS: ,@(map-se vexports)) (SEXPORTS: ,@(map-se sexports)))) (set-module-vexports! mod vexports) - (set-module-sexports! mod sexports)))))) + (set-module-sexports! mod sexports) + (set-module-saved-environments! + mod + (cons (##sys#current-environment) + (##sys#macro-environment)))))))) (define ##sys#module-table '())Trap