X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fdefboot.lisp;h=16fd031579d3eb8daeb3ce3fcf055e875c2674ec;hb=2e002dae2f9a3c64f147ca651751ed833806ad5e;hp=5035116178a441a09c29e8e0084a0bde53de1636;hpb=5830fefc45d371da71a89fe7d8fcde2c5119d36f;p=sbcl.git diff --git a/src/code/defboot.lisp b/src/code/defboot.lisp index 5035116..16fd031 100644 --- a/src/code/defboot.lisp +++ b/src/code/defboot.lisp @@ -69,7 +69,8 @@ (defmacro-mundanely cond (&rest clauses) (if (endp clauses) nil - (let ((clause (first clauses))) + (let ((clause (first clauses)) + (more (rest clauses))) (if (atom clause) (error "COND clause is not a list: ~S" clause) (let ((test (first clause)) @@ -79,22 +80,25 @@ `(let ((,n-result ,test)) (if ,n-result ,n-result - (cond ,@(rest clauses))))) - `(if ,test - (progn ,@forms) - (cond ,@(rest clauses))))))))) + (cond ,@more)))) + (if (eq t test) + `(progn ,@forms) + `(if ,test + (progn ,@forms) + ,(when more `(cond ,@more)))))))))) -;;; other things defined in terms of COND (defmacro-mundanely when (test &body forms) #!+sb-doc "If the first argument is true, the rest of the forms are - evaluated as a PROGN." - `(cond (,test nil ,@forms))) +evaluated as a PROGN." + `(if ,test (progn ,@forms) nil)) + (defmacro-mundanely unless (test &body forms) #!+sb-doc "If the first argument is not true, the rest of the forms are - evaluated as a PROGN." - `(cond ((not ,test) nil ,@forms))) +evaluated as a PROGN." + `(if ,test nil (progn ,@forms))) + (defmacro-mundanely and (&rest forms) (cond ((endp forms) t) ((endp (rest forms)) (first forms)) @@ -102,6 +106,7 @@ `(if ,(first forms) (and ,@(rest forms)) nil)))) + (defmacro-mundanely or (&rest forms) (cond ((endp forms) nil) ((endp (rest forms)) (first forms))