guile-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

guile/guile-core/ice-9 boot-9.scm


From: Marius Vollmer
Subject: guile/guile-core/ice-9 boot-9.scm
Date: Mon, 12 Feb 2001 17:07:45 -0800

CVSROOT:        /cvs
Module name:    guile
Changes by:     Marius Vollmer <address@hidden> 01/02/12 17:07:45

Modified files:
        guile-core/ice-9: boot-9.scm 

Log message:
        * boot-9.scm (define-public): Removed spurious call to
        `interaction-evironment'.
        (define-public, defmacro-public): Use `export' instead of explicit
        module magic.
        (eval-when): New macro.
        (define-module, use-modules, use-syntax, export): Use it to
        restrict the use of these forms to the top level.
        (define-public, defmacro-public): Only export binding when on
        top-level.
        (process-define-module): Call `set-current-module' with the
        defined module.
        (define-module): Simply call `process-define-module' without any
        fuss (but only on top-level).
        (named-module-use!): New function.
        (top-repl): Do not use `define-module'.  Use equivalent low-level
        means instead.

CVSWeb URLs:
http://subversions.gnu.org/cgi-bin/cvsweb/guile/guile-core/ice-9/boot-9.scm.diff?r1=1.224&r2=1.225

Patches:
Index: guile/guile-core/ice-9/boot-9.scm
diff -u guile/guile-core/ice-9/boot-9.scm:1.224 
guile/guile-core/ice-9/boot-9.scm:1.225
--- guile/guile-core/ice-9/boot-9.scm:1.224     Sun Feb 11 10:16:58 2001
+++ guile/guile-core/ice-9/boot-9.scm   Mon Feb 12 17:07:45 2001
@@ -1691,6 +1691,7 @@
                     (append (cadr kws) exports)))
              (else     
               (error "unrecognized defmodule argument" kws))))))
+    (set-current-module module)
     module))
 
 ;;; {Autoload}
@@ -2509,16 +2510,51 @@
             (car rest)
             `(lambda ,(cdr first) ,@rest))))
     `(define ,name (defmacro:syntax-transformer ,transformer))))
+
+;; EVAL-WHEN
+;;
+;; (eval-when ((situation*) forms)* (else forms)?)
+;;
+;; Evaluate certain code based on the situation that eval-when is used
+;; in.  The only defined situation right now is `load-toplevel' which
+;; triggers for code evaluated at the top-level, for example from the
+;; REPL or when loading a file.
+ 
+(define eval-when
+  (procedure->memoizing-macro
+   (lambda (exp env)
+     (define (toplevel-env? env)
+       (or (not (pair? env)) (not (pair? (car env)))))
+     (define (syntax)
+       (error "syntax error in eval-when"))
+     (let loop ((clauses (cdr exp)))
+       (cond 
+       ((null? clauses)
+        #f)
+       ((not (list? (car clauses)))
+        (syntax))
+       ((eq? 'else (caar clauses))
+        (or (null? (cdr clauses))
+            (syntax))
+        (cons 'begin (cdar clauses)))
+       ((not (list? (caar clauses)))
+        (syntax))
+       ((and (toplevel-env? env)
+             (memq 'load-toplevel (caar clauses)))
+        (cons 'begin (cdar clauses)))
+       (else
+        (loop (cdr clauses))))))))
+
 
 ;;; {Module System Macros}
 ;;;
 
 (defmacro define-module args
-  `(let* ((process-define-module process-define-module)
-         (set-current-module set-current-module)
-         (module (process-define-module ',args)))
-     (set-current-module module)
-     module))
+  `(eval-when
+    ((load-toplevel)
+     (process-define-module ',args))
+    (else
+     (error "define-module can only be used at the top level"))))
 
 ;; the guts of the use-modules macro.  add the interfaces of the named
 ;; modules to the use-list of the current module, in order
@@ -2531,16 +2567,23 @@
            (reverse module-names)))
 
 (defmacro use-modules modules
-  `(process-use-modules ',modules))
+  `(eval-when
+    ((load-toplevel)
+     (process-use-modules ',modules))
+    (else
+     (error "use-modules can only be used at the top level"))))
 
 (defmacro use-syntax (spec)
-  `(begin
+  `(eval-when
+    ((load-toplevel)
      ,@(if (pair? spec)
           `((process-use-modules ',(list spec))
             (set-module-transformer! (current-module)
                                      ,(car (last-pair spec))))
           `((set-module-transformer! (current-module) ,spec)))
-     (fluid-set! scm:eval-transformer (module-transformer (current-module)))))
+     (fluid-set! scm:eval-transformer (module-transformer (current-module))))
+    (else
+     (error "use-modules can only be used at the top level"))))
 
 (define define-private define)
 
@@ -2553,53 +2596,30 @@
      ((pair? n) (defined-name (car n)))
      (else (syntax))))
   (cond
-   ((null? args) (syntax))
+   ((null? args)
+    (syntax))
+   (#t
+    (let ((name (defined-name (car args))))
+      `(begin
+        (eval-when ((load-toplevel) (export ,name)))
+        (define-private ,@args))))))
 
-   (#t (let ((name (defined-name (car args))))
-        `(begin
-           (let ((public-i (module-public-interface (current-module))))
-             ;; Make sure there is a local variable:
-             ;;
-             (module-define! (current-module)
-                             ',name
-                             (module-ref (current-module) ',name #f))
-                              
-             ;; Make sure that local is exported:
-             ;;
-             (module-add! public-i ',name
-                          (module-variable (current-module) ',name)))
-                              
-           ;; Now (re)define the var normally.
-           (define-private ,@ args) (interaction-environment))))))
-
 (defmacro defmacro-public args
   (define (syntax)
     (error "bad syntax" (list 'defmacro-public args)))
   (define (defined-name n)
     (cond
-     ((symbol? n)      n)
-     (else             (syntax))))
+     ((symbol? n) n)
+     (else (syntax))))
   (cond
-   ((null? args)       (syntax))
-
-   (#t                         (let ((name (defined-name (car args))))
-                         `(begin
-                            (let ((public-i (module-public-interface 
(current-module))))
-                              ;; Make sure there is a local variable:
-                              ;;
-                              (module-define! (current-module)
-                                              ',name
-                                              (module-ref (current-module) 
',name #f))
-                              
-                              ;; Make sure that local is exported:
-                              ;;
-                              (module-add! public-i ',name (module-variable 
(current-module) ',name)))
-                              
-                            ;; Now (re)define the var normally.
-                            ;;
-                            (defmacro ,@ args))))))
+   ((null? args)
+    (syntax))
+   (#t
+    (let ((name (defined-name (car args))))
+      `(begin
+        (eval-when ((load-toplevel) (export ,name)))
+        (defmacro ,@args))))))
 
-
 (define (module-export! m names)
   (let ((public-i (module-public-interface m)))
     (for-each (lambda (name)
@@ -2610,7 +2630,11 @@
              names)))
 
 (defmacro export names
-  `(module-export! (current-module) ',names))
+  `(eval-when
+    ((load-toplevel)
+     (module-export! (current-module) ',names))
+    (else
+     (error "export can only be used at the top level"))))
 
 (define export-syntax export)
 
@@ -2622,10 +2646,13 @@
 
 ;;; {Load emacs interface support if emacs option is given.}
 
+(define (named-module-use! user usee)
+  (module-use! (resolve-module user) (resolve-module usee)))
+
 (define (load-emacs-interface)
   (if (memq 'debug-extensions *features*)
       (debug-enable 'backtrace))
-  (define-module (guile-user) :use-module (ice-9 emacs)))
+  (named-module-use! '(guile-user) '(ice-9 emacs)))
 
 
 
@@ -2643,15 +2670,16 @@
       (load-emacs-interface))
 
   ;; Place the user in the guile-user module.
-  (define-module (guile-user)
-    :use-module (guile) ;so that bindings will be checked here first
-    :use-module (ice-9 session)
-    :use-module (ice-9 debug)
-    :autoload (ice-9 debugger) (debug))        ;load debugger on demand
+  (process-define-module 
+   '((guile-user)
+     :use-module (guile)    ;so that bindings will be checked here first
+     :use-module (ice-9 session)
+     :use-module (ice-9 debug)
+     :autoload (ice-9 debugger) (debug)))  ;load debugger on demand
   (if (memq 'threads *features*)
-      (define-module (guile-user) :use-module (ice-9 threads)))
+      (named-module-use! '(guile-user) '(ice-9 threads)))
   (if (memq 'regex *features*)
-      (define-module (guile-user) :use-module (ice-9 regex)))
+      (named-module-use! '(guile-user) '(ice-9 regex)))
 
   (let ((old-handlers #f)
        (signals (if (provided? 'posix)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]