X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fdefboot.lisp;h=149997fced65bcb2f612444836361d7c54664058;hb=5dcf5905dc38232b3cc5ec6b309ea5c6424db957;hp=2cd77e906c61dee12e008efc6cbc7c38caa15937;hpb=ce18bcfe50994889a5e3245cacd8702b5a0ced89;p=sbcl.git diff --git a/src/code/defboot.lisp b/src/code/defboot.lisp index 2cd77e9..149997f 100644 --- a/src/code/defboot.lisp +++ b/src/code/defboot.lisp @@ -304,18 +304,23 @@ ;; since we don't want to use IGNORABLE on what might be a special ;; var. (multiple-value-bind (forms decls) (parse-body body :doc-string-allowed nil) - (let ((n-list (gensym))) - `(do* ((,n-list ,list (cdr ,n-list))) - ((endp ,n-list) - ,@(if result - `((let ((,var nil)) - ,var - ,result)) - '(nil))) - (let ((,var (car ,n-list))) - ,@decls - (tagbody - ,@forms)))))) + (let ((n-list (gensym "N-LIST")) + (start (gensym "START"))) + `(block nil + (let ((,n-list ,list)) + (tagbody + ,start + (unless (endp ,n-list) + (let ((,var (car ,n-list))) + ,@decls + (setq ,n-list (cdr ,n-list)) + (tagbody ,@forms)) + (go ,start)))) + ,(if result + `(let ((,var nil)) + ,var + ,result) + nil))))) ;;;; conditions, handlers, restarts @@ -579,10 +584,8 @@ `(let ((,(caaddr annotated-case) ,var)) ,@body)) - ((not (cdr body)) - (car body)) (t - `(progn ,@body))))))) + `(locally ,@body))))))) annotated-cases)))))))) ;;;; miscellaneous