From 287890dce70b3b851352cda1272383f5f461d6d0 Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Sun, 2 Apr 2017 18:47:44 +0200 Subject: [PATCH 1/4] Add chicken.internal.module, move module-environment to chicken.eval This contains the stuff from the "modules" unit. The "internal" namespace is used to declare that these _really_ shouldn't be used in user programs, much like the stuff in the "chicken.internal" module. This allows us to move "module-environment" from modules.scm to eval.scm, finalizing the chicken.eval module as defined by the CHICKEN 5 reorganisation roadmap. This also removes a few bogus (declare (not inline ...)) entries from eval.scm, those were undefined or defined elsewhere. Maybe later, the definitions from modules.scm could be moved elsewhere, for example some parts could go into eval.scm and others into internal.scm --- README | 1 + chicken-install.scm | 1 + chicken.import.scm | 2 +- defaults.make | 7 +++--- distribution/manifest | 2 ++ eval.scm | 22 ++++++++++++++----- modules.scm | 61 ++++++++++++++++++++------------------------------- rules.make | 4 +++- tests/runtests.sh | 1 + types.db | 2 +- 10 files changed, 55 insertions(+), 48 deletions(-) diff --git a/README b/README index 9d1c137..a6be478 100644 --- a/README +++ b/README @@ -291,6 +291,7 @@ | | |-- chicken.format.import.so | | |-- chicken.gc.import.so | | |-- chicken.internal.import.so + | | |-- chicken.internal.module.import.so | | |-- chicken.io.import.so | | |-- chicken.irregex.import.so | | |-- chicken.keyword.import.so diff --git a/chicken-install.scm b/chicken-install.scm index cad0b00..93aea83 100644 --- a/chicken-install.scm +++ b/chicken-install.scm @@ -61,6 +61,7 @@ "chicken.gc.import.so" "chicken.import.so" "chicken.internal.import.so" + "chicken.internal.module.import.so" "chicken.io.import.so" "chicken.irregex.import.so" "chicken.keyword.import.so" diff --git a/chicken.import.scm b/chicken.import.scm index befdca7..ca439fc 100644 --- a/chicken.import.scm +++ b/chicken.import.scm @@ -129,7 +129,7 @@ make-parameter make-promise make-property-condition - module-environment + (module-environment . chicken.eval#module-environment) (most-negative-fixnum . chicken.fixnum#most-negative-fixnum) (most-positive-fixnum . chicken.fixnum#most-positive-fixnum) nan? diff --git a/defaults.make b/defaults.make index 37f69a3..519c0f9 100644 --- a/defaults.make +++ b/defaults.make @@ -265,9 +265,10 @@ CHICKEN_PROGRAM_OPTIONS += $(if $(PROFILE_OBJECTS),-profile) PRIMITIVE_IMPORT_LIBRARIES = chicken chicken.csi chicken.foreign DYNAMIC_IMPORT_LIBRARIES = setup-api setup-download srfi-4 -DYNAMIC_CHICKEN_IMPORT_LIBRARIES = bitwise errno file.posix fixnum flonum \ - format gc io keyword locative memory posix pretty-print process \ - process.signal process-context random time time.posix +DYNAMIC_CHICKEN_IMPORT_LIBRARIES = bitwise errno file.posix fixnum \ + flonum format gc internal.module io keyword locative memory \ + posix pretty-print process process.signal process-context \ + random time time.posix DYNAMIC_CHICKEN_COMPILER_IMPORT_LIBRARIES = user-pass DYNAMIC_CHICKEN_UNIT_IMPORT_LIBRARIES = continuation data-structures \ eval expand file files internal irregex lolevel pathname port \ diff --git a/distribution/manifest b/distribution/manifest index 43d058a..1db9e71 100644 --- a/distribution/manifest +++ b/distribution/manifest @@ -296,6 +296,8 @@ chicken.gc.import.scm chicken.gc.import.c chicken.internal.import.scm chicken.internal.import.c +chicken.internal.module.import.scm +chicken.internal.module.import.c chicken.io.import.scm chicken.io.import.c chicken.irregex.import.scm diff --git a/eval.scm b/eval.scm index 72977a8..215afef 100644 --- a/eval.scm +++ b/eval.scm @@ -27,8 +27,7 @@ (declare (unit eval) - (uses chicken-syntax expand internal modules) - (not inline ##sys#alias-global-hook ##sys#user-read-hook ##sys#syntax-error-hook)) + (uses chicken-syntax expand internal modules)) #> #ifndef C_INSTALL_EGG_HOME @@ -50,17 +49,22 @@ (chicken-home dynamic-load-libraries eval eval-handler extension-information load load-library load-noisily load-relative load-verbose - interaction-environment null-environment scheme-report-environment load-extension provide provided? repository-path - require set-dynamic-load-mode!) + require set-dynamic-load-mode! + + ;; environments + interaction-environment module-environment null-environment + scheme-report-environment) ;; Exclude bindings defined within this module. (import (except scheme eval load interaction-environment null-environment scheme-report-environment) - (except chicken chicken-home provide provided? repository-path require)) + (except chicken chicken-home provide provided? repository-path + require module-environment)) (import chicken.expand chicken.foreign chicken.internal + chicken.internal.module chicken.keyword) (include "common-declarations.scm") @@ -1326,6 +1330,14 @@ ;;; Environments: +(define (module-environment mname #!optional (ename mname)) + (let ((mod (find-module/import-library mname 'module-environment))) + (if (not mod) + (##sys#syntax-error-hook + 'module-environment "undefined module" mname) + (##sys#make-structure + 'environment ename (car (module-saved-environments mod)) #t)))) + (define interaction-environment (let ((e (##sys#make-structure 'environment 'interaction-environment #f #f))) (lambda () e))) diff --git a/modules.scm b/modules.scm index 91099db..ff30e93 100644 --- a/modules.scm +++ b/modules.scm @@ -24,25 +24,35 @@ ; POSSIBILITY OF SUCH DAMAGE. +;; this unit needs the "eval" unit, but must be initialized first (as +;; eval uses modules quite extensively), so it doesn't declare "eval" +;; as used - if you use "-explicit-use", take care of this. + (declare (unit modules) - (uses eval expand internal) + (uses expand internal) (disable-interrupts) (fixnum) - (not inline ##sys#alias-global-hook) - (hide check-for-redef find-export find-module/import-library - mark-imported-symbols match-functor-argument merge-se - module-indirect-exports module-rename register-undefined)) - + (not inline ##sys#alias-global-hook)) + +(module chicken.internal.module + (find-module/import-library module-saved-environments) + +(import scheme + (only chicken + cut declare define-inline define-record-type error include + parameterize make-parameter when unless and-let* void + let-values fluid-let get-output-string open-output-string) + chicken.fixnum + chicken.expand + chicken.internal + chicken.keyword) + (include "common-declarations.scm") (include "mini-srfi-1.scm") (define-syntax d (syntax-rules () ((_ . _) (void)))) -(import chicken.expand - chicken.internal - chicken.keyword) - (define-alias dd d) (define-alias dm d) (define-alias dx d) @@ -67,21 +77,6 @@ (define ##sys#current-module (make-parameter #f)) (define ##sys#module-alias-environment (make-parameter '())) -(declare - (hide make-module module? %make-module - module-name module-library - module-vexports module-sexports - set-module-vexports! set-module-sexports! - module-export-list set-module-export-list! - module-defined-list set-module-defined-list! - module-import-forms set-module-import-forms! - 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-saved-environments set-module-saved-environments! - module-iexports set-module-iexports!)) - (define-record-type module (%make-module name library export-list defined-list exist-list defined-syntax-list undefined-list import-forms meta-import-forms meta-expressions @@ -418,7 +413,7 @@ (set! ##sys#module-table (cons (cons name mod) ##sys#module-table)) mod)) -;; same as register-builtin, but uses module's name as its library +;; same as register-core-module, but uses module's name as its library (define (##sys#register-primitive-module name vexports #!optional (sexports '())) (##sys#register-core-module name name vexports sexports)) @@ -568,7 +563,7 @@ (##sys#macro-environment (##sys#meta-macro-environment))) (fluid-let ((##sys#notices-enabled #f)) ; to avoid re-import warnings - (chicken.eval#load il) + (chicken.eval#load il) ; TODO: This is a cyclic dependency (set! mod (##sys#find-module mname 'import)))))) mod)) @@ -791,7 +786,7 @@ (apply ##sys#syntax-error-hook loc args)) (define (iface name) (or (getp name '##core#interface) - (err "unknown interface" x exps))) + (err "unknown interface" name exps))) (cond ((eq? '* exps) exps) ((symbol? exps) (iface exps)) ((not (list? exps)) @@ -1036,12 +1031,4 @@ '(get-environment-variable (get-environment-variables . chicken.posix#get-environment-variables))) -(register-feature! 'module-environments) - -(define (module-environment mname #!optional (ename mname)) - (let ((mod (find-module/import-library mname 'module-environment))) - (if (not mod) - (##sys#syntax-error-hook - 'module-environment "undefined module" mname) - (##sys#make-structure - 'environment ename (car (module-saved-environments mod)) #t)))) +) diff --git a/rules.make b/rules.make index acd8bf3..61d7b2f 100644 --- a/rules.make +++ b/rules.make @@ -536,6 +536,7 @@ $(eval $(call declare-emitted-import-lib-dependency,chicken.pretty-print,extras) $(eval $(call declare-emitted-import-lib-dependency,chicken.random,extras)) $(eval $(call declare-emitted-import-lib-dependency,chicken.locative,lolevel)) $(eval $(call declare-emitted-import-lib-dependency,chicken.memory,lolevel)) +$(eval $(call declare-emitted-import-lib-dependency,chicken.internal.module,modules)) chicken.c: chicken.scm mini-srfi-1.scm \ chicken.compiler.batch-driver.import.scm \ @@ -742,6 +743,7 @@ eval.c: eval.scm \ chicken.expand.import.scm \ chicken.foreign.import.scm \ chicken.internal.import.scm \ + chicken.internal.module.import.scm \ chicken.keyword.import.scm repl.c: repl.scm \ chicken.eval.import.scm @@ -791,7 +793,7 @@ repl.c: $(SRCDIR)repl.scm $(SRCDIR)common-declarations.scm expand.c: $(SRCDIR)expand.scm $(SRCDIR)synrules.scm $(SRCDIR)common-declarations.scm $(bootstrap-lib) -emit-import-library chicken.expand modules.c: $(SRCDIR)modules.scm $(SRCDIR)common-declarations.scm $(SRCDIR)mini-srfi-1.scm - $(bootstrap-lib) + $(bootstrap-lib) -emit-import-library chicken.internal.module extras.c: $(SRCDIR)extras.scm $(SRCDIR)common-declarations.scm $(bootstrap-lib) \ -emit-import-library chicken.format \ diff --git a/tests/runtests.sh b/tests/runtests.sh index 74e7ecf..f09bc6c 100755 --- a/tests/runtests.sh +++ b/tests/runtests.sh @@ -49,6 +49,7 @@ for x in \ chicken.format.import.so \ chicken.gc.import.so \ chicken.internal.import.so \ + chicken.internal.module.import.so \ chicken.io.import.so \ chicken.irregex.import.so \ chicken.keyword.import.so \ diff --git a/types.db b/types.db index ea181e9..b53bdc2 100644 --- a/types.db +++ b/types.db @@ -859,6 +859,7 @@ (chicken.eval#load-library (#(procedure #:enforce) chicken.eval#load-library (symbol #!optional string) undefined)) (chicken.eval#load-relative (#(procedure #:enforce) chicken.eval#load-relative (string #!optional (procedure (*) . *)) undefined)) (chicken.eval#load-verbose (#(procedure #:clean) chicken.eval#load-verbose (#!optional *) *)) +(chicken.eval#module-environment (#(procedure #:clean #:enforce) module-environment ((or symbol (list-of (or symbol fixnum))) #!optional *) (struct environment))) (chicken.eval#provide (#(procedure #:clean #:enforce) chicken.eval#provide (#!rest symbol) undefined)) (chicken.eval#provided? (#(procedure #:clean #:enforce) chicken.eval#provided? (#!rest symbol) boolean)) (chicken.eval#repository-path (#(procedure #:clean) chicken.eval#repository-path (#!optional *) *)) @@ -1248,7 +1249,6 @@ (chicken.flonum#minimum-flonum float) (chicken.fixnum#most-negative-fixnum fixnum) (chicken.fixnum#most-positive-fixnum fixnum) -(module-environment (#(procedure #:clean #:enforce) module-environment ((or symbol (list-of (or symbol fixnum))) #!optional *) (struct environment))) (on-exit (#(procedure #:clean #:enforce) on-exit ((procedure () . *)) undefined)) (open-input-string (#(procedure #:clean #:enforce) open-input-string (string #!rest) input-port)) (open-output-string (#(procedure #:clean) open-output-string (#!rest) output-port)) -- 2.1.4