guile-commits
[Top][All Lists]
Advanced

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

[Guile-commits] 23/36: eval-when


From: Christopher Allan Webber
Subject: [Guile-commits] 23/36: eval-when
Date: Tue, 19 Oct 2021 17:59:39 -0400 (EDT)

cwebber pushed a commit to branch wip-elisp-rebased
in repository guile.

commit 9196cf26713ba2830191e88808a13fb816e825ca
Author: Robin Templeton <robin@terpri.org>
AuthorDate: Mon Aug 4 23:16:09 2014 -0400

    eval-when
    
    (Best-ability ChangeLog annotation added by Christopher Allan Webber.)
    
    * module/language/elisp/compile-tree-il.scm (progn): Use compile-expr-1
      instead of compile-expr.
      (toplevel?, compile-time-too?): New fluids.
      (eval-when): New special form.
      (compile-expr, compile-expr-1): compile-expr is renamed to
      compile-expr-1, and compile-expr  is now a procedure which, if
      fulid-ref of toplevel? is true, will call compile-expr-1 with
      toplevel? fulid bound to #f.  Otherwise, continue with compile-expr-1.
      (compile-tree-il): Set toplevel? and compile-time-too? fluids to #t
      during evaluation.
---
 module/language/elisp/compile-tree-il.scm | 45 ++++++++++++++++++++++++++++---
 1 file changed, 41 insertions(+), 4 deletions(-)

diff --git a/module/language/elisp/compile-tree-il.scm 
b/module/language/elisp/compile-tree-il.scm
index 24d6cc4..9533e91 100644
--- a/module/language/elisp/compile-tree-il.scm
+++ b/module/language/elisp/compile-tree-il.scm
@@ -461,13 +461,42 @@
   (list->seq loc
              (if (null? args)
                  (list (nil-value loc))
-                 (map compile-expr args))))
+                 (map compile-expr-1 args))))
 
 (defspecial eval-when-compile (loc args)
   (make-const loc (with-native-target
                    (lambda ()
                      (compile `(progn ,@args) #:from 'elisp #:to 'value)))))
 
+(define toplevel? (make-fluid))
+
+(define compile-time-too? (make-fluid))
+
+(defspecial eval-when (loc args)
+  (pmatch args
+    ((,situations . ,forms)
+     (let ((compile? (memq ':compile-toplevel situations))
+           (load? (memq ':load-toplevel situations))
+           (execute? (memq ':execute situations)))
+       (cond
+        ((not (fluid-ref toplevel?))
+         (if execute?
+             (compile-expr `(progn ,@forms))
+             (make-const loc #nil)))
+        (load?
+         (with-fluids ((compile-time-too?
+                        (cond (compile? #t)
+                              (execute? (fluid-ref compile-time-too?))
+                              (else #f))))
+           (when (fluid-ref compile-time-too?)
+             (eval-elisp `(progn ,@forms)))
+           (compile-expr-1 `(progn ,@forms))))
+        ((or compile? (and execute? (fluid-ref compile-time-too?)))
+         (eval-elisp `(progn ,@forms))
+         (make-const loc #nil))
+        (else
+         (make-const loc #nil)))))))
+
 (defspecial if (loc args)
   (pmatch args
     ((,cond ,then . ,else)
@@ -826,7 +855,7 @@
 
 ;;; Compile a single expression to TreeIL.
 
-(define (compile-expr expr)
+(define (compile-expr-1 expr)
   (let ((loc (location expr)))
     (cond
      ((symbol? expr)
@@ -835,9 +864,17 @@
       (compile-pair loc expr))
      (else (make-const loc expr)))))
 
+(define (compile-expr expr)
+  (if (fluid-ref toplevel?)
+      (with-fluids ((toplevel? #f))
+        (compile-expr-1 expr))
+      (compile-expr-1 expr)))
+
 (define (compile-tree-il expr env opts)
   (values
-   (with-fluids ((bindings-data (make-bindings)))
-     (compile-expr expr))
+   (with-fluids ((bindings-data (make-bindings))
+                 (toplevel? #t)
+                 (compile-time-too? #f))
+     (compile-expr-1 expr))
    env
    env))



reply via email to

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