src/module-impl.lisp, src/module-parse.lisp: Set module environment better.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 10 Aug 2019 13:46:32 +0000 (14:46 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 10 Aug 2019 14:47:10 +0000 (15:47 +0100)
Previously, `read-module' halfheartedly set `*package*' and
`*readtable*'.  Do better, by setting lots of influential variables as
module variables with appropriate initial values.

src/module-impl.lisp
src/module-parse.lisp

index 1eb2531..fc068d3 100644 (file)
 
 (cl:in-package #:sod)
 
+;; Establish a standard environment within the body of a module.  This is an
+;; attempt -- but not a wholly successful one -- to present the same
+;; environment to a module independent of the context in which we imported
+;; it.
+
+;;;--------------------------------------------------------------------------
+;;; Module variables.
+
+(eval-when (:load-toplevel :execute)
+  (macrolet ((fix (var &optional (value var))
+              (once-only (value)
+                `(add-module-binding ',var (lambda () ,value)))))
+
+    ;; Use `sod-user' package by default.  This seems the most useful.  Alas,
+    ;; some tenants might not keep it as tidy as we'd like, but there are
+    ;; probably useful ways to side-effect the package too.
+    (fix *package* (find-package "SOD-USER"))
+
+    ;; Stream bindings.  Hope that the values we find at load time are
+    ;; sufficiently sensible.
+    (fix *debug-io*)
+    (fix *error-output*)
+    (fix *query-io*)
+    (fix *standard-input*)
+    (fix *standard-output*)
+    (fix *terminal-io*)
+    (fix *trace-output*)
+
+    ;; Print state.
+    (fix *print-array* t)
+    (fix *print-base* 10)
+    (fix *print-case* :upcase)
+    (fix *print-circle* nil)
+    (fix *print-escape* t)
+    (fix *print-gensym* t)
+    (fix *print-length* nil)
+    (fix *print-level* nil)
+    (fix *print-lines* nil)
+    (fix *print-miser-width*)
+    (fix *print-pretty* t)
+    (fix *print-radix* nil)
+    (fix *print-readably* nil)
+    (fix *print-right-margin*)
+
+    ;; Read state.
+    (fix *read-base* 10)
+    (fix *read-eval* t)
+    (fix *read-suppress* nil)
+    (fix *readtable* (copy-readtable nil))))
+
 ;;;--------------------------------------------------------------------------
 ;;; Module basics.
 
index 170d61f..fed98f8 100644 (file)
   (unless truep (setf truename (truename pathname)))
   (define-module (pathname :location location :truename truename)
     (with-open-file (f-stream pathname :direction :input)
-      (let* ((*readtable* (copy-readtable))
-            (*package* (find-package '#:sod-user))
-            (char-scanner (make-instance 'charbuf-scanner
+      (let* ((char-scanner (make-instance 'charbuf-scanner
                                          :stream f-stream
                                          :filename (namestring pathname)))
             (scanner (make-instance 'sod-token-scanner