;;;; provided with absolutely no warranty. See the COPYING and CREDITS
;;;; files for more information.
-(in-package "SB!EXT")
+(in-package "SB!IMPL")
;;; Lots of code wants to get to the KEYWORD package or the
;;; COMMON-LISP package without a lot of fuss, so we cache them in
;;; 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))
(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))))))))
\f