X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fboot-extensions.lisp;h=63c57a9606edbaef87b3420cc53ed671919c43c1;hb=b8f63d9b4e978bec3bfc1f4fc471e5ed946781fd;hp=550641169b2a9c3d945a720a05d494a14d22a0b1;hpb=95a6db7329b91dd90d165dd4057b9b5098d34aa2;p=sbcl.git diff --git a/src/code/boot-extensions.lisp b/src/code/boot-extensions.lisp index 5506411..63c57a9 100644 --- a/src/code/boot-extensions.lisp +++ b/src/code/boot-extensions.lisp @@ -26,7 +26,7 @@ ;;; a helper function for various macros which expect clauses of a ;;; given length, etc. ;;; -;;; KLUDGE: This implementation will hang on circular list structure. +;;; FIXME: This implementation will hang on circular list structure. ;;; Since this is an error-checking utility, i.e. its job is to deal ;;; with screwed-up input, it'd be good style to fix it so that it can ;;; deal with circular list structure. @@ -155,13 +155,12 @@ ;;; ONCE-ONLY is a utility useful in writing source transforms and ;;; macros. It provides a concise way to wrap a LET around some code ;;; to ensure that some forms are only evaluated once. +;;; +;;; Create a LET* which evaluates each value expression, binding a +;;; temporary variable to the result, and wrapping the LET* around the +;;; result of the evaluation of BODY. Within the body, each VAR is +;;; bound to the corresponding temporary variable. (defmacro once-only (specs &body body) - #!+sb-doc - "Once-Only ({(Var Value-Expression)}*) Form* - Create a Let* which evaluates each Value-Expression, binding a temporary - variable to the result, and wrapping the Let* around the result of the - evaluation of Body. Within the body, each Var is bound to the corresponding - temporary variable." (iterate frob ((specs specs) (body body)) @@ -174,7 +173,7 @@ (let* ((name (first spec)) (exp-temp (gensym (symbol-name name)))) `(let ((,exp-temp ,(second spec)) - (,name (gensym "OO-"))) + (,name (gensym "ONCE-ONLY-"))) `(let ((,,name ,,exp-temp)) ,,(frob (rest specs) body))))))))