0.9.16.27:
[sbcl.git] / src / code / eval.lisp
index 8f0d970..406dc09 100644 (file)
@@ -13,7 +13,7 @@
 
 ;;; general case of EVAL (except in that it can't handle toplevel
 ;;; EVAL-WHEN magic properly): Delegate to #'COMPILE.
-(defun %eval (expr lexenv)
+(defun %simple-eval (expr lexenv)
   ;; FIXME: It might be nice to quieten the toplevel by muffling
   ;; warnings generated by this compilation (since we're about to
   ;; execute the results irrespective of the warnings).  We might want
@@ -26,7 +26,7 @@
     (funcall fun)))
 
 ;;; Handle PROGN and implicit PROGN.
-(defun eval-progn-body (progn-body lexenv)
+(defun simple-eval-progn-body (progn-body lexenv)
   (unless (list-with-length-p progn-body)
     (let ((*print-circle* t))
       (error 'simple-program-error
         (rest-i (rest i) (rest i)))
       (nil)
     (if rest-i ; if not last element of list
-        (eval-in-lexenv (first i) lexenv)
-        (return (eval-in-lexenv (first i) lexenv)))))
+        (simple-eval-in-lexenv (first i) lexenv)
+        (return (simple-eval-in-lexenv (first i) lexenv)))))
 
-(defun eval-locally (exp lexenv &key vars)
+(defun simple-eval-locally (exp lexenv &key vars)
   (multiple-value-bind (body decls)
       (parse-body (rest exp) :doc-string-allowed nil)
     (let ((lexenv
                                   nil
                                   :lexenv lexenv
                                   :context :eval))))
-      (eval-progn-body body lexenv))))
-
-(defun eval (original-exp)
-  #!+sb-doc
-  "Evaluate the argument in a null lexical environment, returning the
-  result or results."
-  (eval-in-lexenv original-exp (make-null-lexenv)))
+      (simple-eval-progn-body body lexenv))))
 
 ;;;; EVAL-ERROR
 ;;;;
 ;;;; Analogous to COMPILER-ERROR, but simpler.
 
-(define-condition eval-error (encapsulated-condition) ())
+(define-condition eval-error (encapsulated-condition)
+  ()
+  (:report (lambda (condition stream)
+             (print-object (encapsulated-condition condition) stream))))
 
 (defun eval-error (condition)
   (signal 'eval-error :condition condition)
   (bug "Unhandled EVAL-ERROR"))
 
 ;;; Pick off a few easy cases, and the various top level EVAL-WHEN
-;;; magical cases, and call %EVAL for the rest.
-(defun eval-in-lexenv (original-exp lexenv)
+;;; magical cases, and call %SIMPLE-EVAL for the rest.
+(defun simple-eval-in-lexenv (original-exp lexenv)
   (declare (optimize (safety 1)))
   ;; (aver (lexenv-simple-p lexenv))
   (handler-bind
              ;; with DEFINE-SYMBOL-MACRO, keeping the code walkers
              ;; happy.
              (:alien
-              (%eval original-exp lexenv))))
+              (%simple-eval original-exp lexenv))))
           (list
            (let ((name (first exp))
                  (n-args (1- (length exp))))
                            (not (consp (let ((sb!c:*lexenv* lexenv))
                                          (sb!c:lexenv-find name funs)))))
                       (%coerce-name-to-fun name)
-                      (%eval original-exp lexenv))))
+                    (%simple-eval original-exp lexenv))))
                ((quote)
                 (unless (= n-args 1)
                   (error "wrong number of args to QUOTE:~% ~S" exp))
                             ;; We duplicate the call to SET so that the
                             ;; correct value gets returned.
                             (set (first args)
-                                 (eval-in-lexenv (second args) lexenv)))
+                                 (simple-eval-in-lexenv (second args) lexenv)))
                          (set (first args)
-                              (eval-in-lexenv (second args) lexenv))))
+                              (simple-eval-in-lexenv (second args) lexenv))))
                     (let ((symbol (first name)))
                       (case (info :variable :kind symbol)
                         (:special)
-                        (t (return (%eval original-exp lexenv))))
+                        (t (return (%simple-eval original-exp lexenv))))
                       (unless (type= (info :variable :type symbol)
                                      *universal-type*)
                         ;; let the compiler deal with type checking
-                        (return (%eval original-exp lexenv)))))))
+                        (return (%simple-eval original-exp lexenv)))))))
                ((progn)
-                (eval-progn-body (rest exp) lexenv))
+                (simple-eval-progn-body (rest exp) lexenv))
                ((eval-when)
                 ;; FIXME: DESTRUCTURING-BIND returns ARG-COUNT-ERROR
                 ;; instead of PROGRAM-ERROR when there's something wrong
                     ;; PROGN; otherwise, the EVAL-WHEN form returns NIL.
                     (declare (ignore ct lt))
                     (when e
-                      (eval-progn-body body lexenv)))))
+                    (simple-eval-progn-body body lexenv)))))
                ((locally)
-                (eval-locally exp lexenv))
+              (simple-eval-locally exp lexenv))
                ((macrolet)
                 (destructuring-bind (definitions &rest body)
                     (rest exp)
                               (declare (ignore funs))
                               sb!c:*lexenv*)
                             :eval))))
-                    (eval-locally `(locally ,@body) lexenv))))
+                  (simple-eval-locally `(locally ,@body) lexenv))))
                ((symbol-macrolet)
                 (destructuring-bind (definitions &rest body) (rest exp)
                   (multiple-value-bind (lexenv vars)
                          (lambda (&key vars)
                            (values sb!c:*lexenv* vars))
                          :eval))
-                    (eval-locally `(locally ,@body) lexenv :vars vars))))
+                    (simple-eval-locally `(locally ,@body) lexenv :vars vars))))
                ((if)
                 (destructuring-bind (test then &optional else) (rest exp)
                   (eval-in-lexenv (if (eval-in-lexenv test lexenv)
                ((let let*)
                 (destructuring-bind (definitions &rest body) (rest exp)
                   (if (null definitions)
-                      (eval-locally `(locally ,@body) lexenv)
-                      (%eval exp lexenv))))
+                      (simple-eval-locally `(locally ,@body) lexenv)
+                      (%simple-eval exp lexenv))))
                (t
                 (if (and (symbolp name)
                          (eq (info :function :kind name) :function))
                       (dolist (arg (rest exp))
                         (args (eval-in-lexenv arg lexenv)))
                       (apply (symbol-function name) (args)))
-                    (%eval exp lexenv))))))
+                    (%simple-eval exp lexenv))))))
           (t
            exp))))))
+
+(defun eval-in-lexenv (exp lexenv)
+  #!+sb-eval
+  (if (eq *evaluator-mode* :compile)
+      (simple-eval-in-lexenv exp lexenv)
+      (sb!eval:eval-in-native-environment exp lexenv))
+  #!-sb-eval
+  (simple-eval-in-lexenv exp lexenv))
+
+(defun eval (original-exp)
+  #!+sb-doc
+  "Evaluate the argument in a null lexical environment, returning the
+   result or results."
+  (eval-in-lexenv original-exp (make-null-lexenv)))
+
 \f
 ;;; miscellaneous full function definitions of things which are
 ;;; ordinarily handled magically by the compiler