(unless ,(first endlist) (go ,label-1))
(return-from ,block (progn ,@(rest endlist))))))))))
+;;; DO-ANONYMOUS ({(Var [Init] [Step])}*) (Test Exit-Form*) Declaration* Form*
+;;;
+;;; This is like DO, except it has no implicit NIL block. Each VAR is
+;;; initialized in parallel to the value of the specified INIT form.
+;;; On subsequent iterations, the VARS are assigned the value of the
+;;; STEP form (if any) in parallel. The TEST is evaluated before each
+;;; evaluation of the body FORMS. When the TEST is true, the
+;;; EXIT-FORMS are evaluated as a PROGN, with the result being the
+;;; value of the DO.
(defmacro do-anonymous (varlist endlist &rest body)
- #!+sb-doc
- "DO-ANONYMOUS ({(Var [Init] [Step])}*) (Test Exit-Form*) Declaration* Form*
- Like DO, but has no implicit NIL block. Each Var is initialized in parallel
- to the value of the specified Init form. On subsequent iterations, the Vars
- are assigned the value of the Step form (if any) in parallel. The Test is
- evaluated before each evaluation of the body Forms. When the Test is true,
- the Exit-Forms are evaluated as a PROGN, with the result being the value
- of the DO."
(do-do-body varlist endlist body 'let 'psetq 'do-anonymous (gensym)))
\f
;;;; miscellany
;;; Concatenate together the names of some strings and symbols,
;;; producing a symbol in the current package.
-(defun symbolicate (&rest things)
- (values (intern (apply #'concatenate
- 'string
- (mapcar #'string things)))))
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (defun symbolicate (&rest things)
+ (values (intern (apply #'concatenate
+ 'string
+ (mapcar #'string things))))))
;;; like SYMBOLICATE, but producing keywords
(defun keywordicate (&rest things)
(let ((*package* *keyword-package*))
(apply #'symbolicate things)))
-;;; Access *PACKAGE* in a way which lets us recover if someone has
+;;; Access *PACKAGE* in a way which lets us recover when someone has
;;; done something silly like (SETF *PACKAGE* :CL-USER). (Such an
-;;; assignment is undefined behavior, so it's sort of reasonable for it
-;;; to cause the system to go totally insane afterwards, but it's
-;;; a fairly easy mistake to make, so let's try to recover gracefully
+;;; assignment is undefined behavior, so it's sort of reasonable for
+;;; it to cause the system to go totally insane afterwards, but it's a
+;;; fairly easy mistake to make, so let's try to recover gracefully
;;; instead.)
(defun sane-package ()
(let ((maybe-package *package*))
:datum maybe-package
:expected-type 'package
:format-control
- "~S can't be a ~S:~% ~S has been reset to ~S"
+ "~@<~S can't be a ~S: ~2I~_~S has been reset to ~S.~:>"
:format-arguments (list '*package* (type-of maybe-package)
'*package* really-package)))))))
(if (consp id)
(values (car id) (cdr id))
(values id nil))
- ;; (This could be SYMBOLICATE, except that due to
- ;; bogobootstrapping issues SYMBOLICATE isn't defined yet.)
(push `(defconstant ,(symbolicate prefix root suffix)
,(+ start (* step index))
,@docs)
;; ANSI Common Lisp operations.
(eval-when (:compile-toplevel :load-toplevel :execute)
(let ((,expr-tmp ,expr))
- (unless (and (boundp ',symbol)
- (constantp ',symbol)
- (funcall ,eqx (symbol-value ',symbol) ,expr-tmp))
- (defconstant ,symbol ,expr ,@(when doc `(,doc))))))
+ (cond ((boundp ',symbol)
+ (unless (and (constantp ',symbol)
+ (funcall ,eqx
+ (symbol-value ',symbol)
+ ,expr-tmp))
+ (error "already bound differently: ~S")))
+ (t
+ (defconstant ,symbol
+ ;; KLUDGE: This is a very ugly hack, to be able to
+ ;; build SBCL with CMU CL (2.4.19), because there
+ ;; seems to be some confusion in CMU CL about
+ ;; ,EXPR-TEMP at EVAL-WHEN time ... -- MNA 2000-02-23
+ #-cmu ,expr-tmp
+ #+cmu ,expr
+ ,@(when doc `(,doc)))))))
;; The #+SB-XC :COMPILE-TOPLEVEL situation is special, since we
;; want to define the symbol not just in the cross-compilation
;; host Lisp (which was handled above) but also in the
;; instead. -- WHN 2000-11-03
#+sb-xc
(eval-when (:compile-toplevel)
- (let ((,expr-tmp ,expr))
+ (let ((,expr-tmp ,symbol))
(unless (and (eql (info :variable :kind ',symbol) :constant)
(funcall ,eqx
(info :variable :constant-value ',symbol)