* minor incompatible change: Error signalling behaviour of lexical
operations violating package locks has changed slightly. Refer to
documentation on package locks for details.
+ * enhancement: EVAL can process IF-expressions without resorting to the
+ compiler.
* bug fix: LISTEN sometimes returned T even in cases where no data was
immediately available from the stream
* fixed bug: types of the last two arguments to SET-SYNTAX-FROM-CHAR
(values sb!c:*lexenv* vars))
:eval))
(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)
+ then
+ else)
+ lexenv)))
(t
(if (and (symbolp name)
(eq (info :function :kind name) :function))
(with-output-to-string (*standard-output*)
(eval '(progn (princ ".") (let ((x 42)) t) (princ "."))))))
+;;; IF
+(defun true () t)
+(defun false () nil)
+(defmacro oops () (throw :oops (list)))
+(defun test-eval (ok form) (assert (eq ok (catch :oops (eval form)))))
+(test-eval t '(if (false) (oops) t))
+(test-eval t '(if (true) t (oops)))
+(test-eval nil '(if (not (if (false) t)) (oops)))
+
;;; success
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.9.11.35"
+"0.9.11.36"