'(x)
'(1)
(1+ x)) t 2)
- ((progv '(x) '(t)
- (if x 1 2)) t 1)
+ ((progv '(x) '(t)
+ (if x 1 2)) t 1)
((unwind-protect 1 nil) t 1)
((unwind-protect 1
(xxx)) nil)
((the integer 1) t 1)
((the integer (+ 1 1)) t 2)
((the integer (foo)) nil)
+ ((the symbol 1) nil)
+ ((the "bad type" 1) nil)
+ ((multiple-value-prog1
+ (+ 1 1)
+ :nada) t 2)
+ ((multiple-value-prog1
+ :nada
+ (/ 1 0)) nil)
+ ((/ 1 0) nil)
+ ((/ 1 1) t 1)
((+ 1 2) t 3)))
(destructuring-bind (form c &optional v) test
(assert (eql (constantp form) c))
(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)))
+
+;;; TAGBODY
+
+;;; As of SBCL 1.0.1.8, TAGBODY should not accept duplicate go tags,
+;;; yet choked on two duplicate tags. Note that this test asserts a
+;;; failure.
+(with-test (:name :tagbody-dual-go-tags)
+ (progn
+ (defun tagbody-dual-go-tags ()
+ (restart-case
+ (handler-bind ((error (lambda (c)
+ (declare (ignore c))
+ (invoke-restart 'NOT-AN-ERROR))))
+ (tagbody :A :A) nil)
+ (NOT-AN-ERROR () t)))
+ (assert (tagbody-dual-go-tags))))
+
+;;; Ensure that NIL is a valid go tag.
+(with-test (:name :tagbody-nil-is-valid-tag)
+ (progn
+ (defun tagbody-nil-is-valid-tag ()
+ (tagbody (go NIL) NIL) t)
+ (assert (tagbody-nil-is-valid-tag))))
+
;;; success