diff options
| -rw-r--r-- | sb-eval2.lisp | 54 | 
1 files changed, 39 insertions, 15 deletions
diff --git a/sb-eval2.lisp b/sb-eval2.lisp index 029c6a1..dd4de2c 100644 --- a/sb-eval2.lisp +++ b/sb-eval2.lisp @@ -381,8 +381,10 @@        (apply (the (or symbol function) (funcall (the eval-closure f) env))               (mapcar (lambda (x) (funcall (the eval-closure x) env)) args*))))) -(declaim (ftype (function (list context) (values eval-closure &rest nil)) prepare-progn)) -(defun prepare-progn (forms context) +(declaim (ftype (function (list context &optional symbol) +                          (values eval-closure &rest nil)) +                prepare-progn)) +(defun prepare-progn (forms context &optional (*mode* *mode*))    (let ((body* (mapcar (lambda (form) (prepare-form form context)) forms)))      (if (null body*)          (prepare-nil) @@ -724,8 +726,10 @@            :format-control "Undefined variable: ~S"            :format-arguments (list var)))) -(declaim (ftype (function (* context) eval-closure) prepare-form)) -(defun prepare-form (form context) +(defvar *mode* :not-compile-time) + +(declaim (ftype (function (* context &optional symbol) eval-closure) prepare-form)) +(defun prepare-form (form context &optional (mode *mode*) &aux (*mode* :execute))    ;;(declare (optimize speed (safety 0) (space 1) (debug 0)))    ;;(print form)    (values @@ -737,7 +741,7 @@          (symbol           (let ((macro? (context-find-symbol-macro context form)))             (if macro? -               (prepare-form macro? context) +               (prepare-form macro? context mode)                 (prepare-ref form context))))          (cons           (case (first form) @@ -810,16 +814,34 @@                    (catch tag                      (funcall body* env))))))             ((declare) -            ;;FIXME +            (warn "DECLARE in form context.")              (prepare-nil))             ((eval-when)              (destructuring-bind ((&rest times) &body body) (rest form) -              (if (or (member :load-toplevel times) -                      (member :execute times) -                      (member 'load times) -                      (member 'eval times)) -                  (prepare-progn body context) -                  (prepare-nil)))) +              (cond ((member mode '(:not-compile-time :compile-time-too)) +                     (let ((ct (or (member :compile-toplevel times) +                                   (member 'cl:compile times))) +                           (lt (or (member :load-toplevel times) +                                   (member 'cl:load times))) +                           (e  (or (member :execute times) +                                   (member 'cl:eval times)))) +                       (cond ((and lt ct) +                              (prepare-progn body context :compile-time-too)) +                             ((and lt e) +                              (prepare-progn body context mode)) +                             (lt +                              (prepare-progn body context :not-compile-time)) +                             (ct +                              (prepare-progn body context)) +                             ((and e (eq mode :compile-time-too)) +                              (prepare-progn body context)) +                             (t +                              (prepare-nil))))) +                    ((or (member :execute times) +                         (member 'cl:eval times)) +                     (prepare-progn body context)) +                    (t +                     (prepare-nil)))))             ((flet)              (destructuring-bind (bindings &rest exprs) (rest form)                (with-parsed-body (body specials) exprs @@ -1014,7 +1036,7 @@                                  do (setf (symbol-value (cdr spec)) (pop values)))                          (funcall body* new-env))))))))             ((progn) -            (prepare-progn (rest form) context)) +            (prepare-progn (rest form) context mode))             ((progv)              (destructuring-bind (vals vars &body body) (rest form)                (let ((vals* (prepare-form vals context)) @@ -1072,7 +1094,8 @@                    (prepare-progn body                                   (context-add-specials                                    (context-add-symbol-macros context bindings) -                                  specials)))))) +                                  specials) +                                 mode)))))             ((macrolet)              (destructuring-bind (bindings &rest exprs) (rest form)                (with-parsed-body (body specials) exprs @@ -1087,7 +1110,8 @@                    (prepare-progn body                                   (context-add-specials                                    (context-add-macros context bindings) -                                  specials)))))) +                                  specials) +                                 mode)))))             ((go)              (let* ((go-tag    (second form))                     (catch-tag (context-find-go-tag context go-tag)))  | 
