0.6.8.21:
[sbcl.git] / src / code / early-extensions.lisp
index 0288453..25ae528 100644 (file)
@@ -18,6 +18,9 @@
 
 (in-package "SB!EXT")
 
+;;; something not EQ to anything we might legitimately READ
+(defparameter *eof-object* (make-symbol "EOF-OBJECT"))
+
 ;;; a type used for indexing into arrays, and for related quantities
 ;;; like lengths of lists
 ;;;
 (defconstant escape-char-code 27)
 (defconstant rubout-char-code 127)
 \f
-;;; Concatenate together the names of some strings and symbols,
-;;; producing a symbol in the current package.
-(eval-when (:compile-toplevel :load-toplevel :execute)
-  (declaim (ftype (function (&rest (or string symbol)) symbol) symbolicate))
-  (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)))
-\f
 ;;;; miscellaneous iteration extensions
 
 (defmacro dovector ((elt vector &optional result) &rest forms)
       (let ((n 0))
         (dolist (arg args)
           (unless (= (length arg) 2)
-            (error "bad arg spec: ~S" arg))
+            (error "bad argument spec: ~S" arg))
           (let ((arg-name (first arg))
                 (test (second arg)))
             (arg-vars arg-name)
       (let ((fun-name (symbolicate name "-CACHE-CLEAR")))
        (forms
         `(defun ,fun-name ()
+           (/show0 ,(concatenate 'string "entering " (string fun-name)))
            (do ((,n-index ,(- total-size entry-size) (- ,n-index ,entry-size))
                 (,n-cache ,var-name))
                ((minusp ,n-index))
                            `(setf (svref ,n-cache ,i) ,val))
                        (values-indices)
                        default-values))
+           (/show0 ,(concatenate 'string "leaving " (string fun-name)))
            (values)))
        (forms `(,fun-name)))
 
 (declaim (ftype (function (index) list) make-gensym-list))
 (defun make-gensym-list (n)
   (loop repeat n collect (gensym)))
+
+;;; ANSI guarantees that some symbols are self-evaluating. This
+;;; function is to be called just before a change which would affect
+;;; that. (We don't absolutely have to call this function before such
+;;; changes, since such changes are given as undefined behavior. In
+;;; particular, we don't if the runtime cost would be annoying. But
+;;; otherwise it's nice to do so.)
+(defun about-to-modify (symbol)
+  (declare (type symbol symbol))
+  (cond ((eq symbol t)
+        (error "Veritas aeterna. (can't change T)"))
+       ((eq symbol nil)
+        (error "Nihil ex nihil. (can't change NIL)"))
+       ((keywordp symbol)
+        (error "Keyword values can't be changed."))
+       ;; (Just because a value is CONSTANTP is not a good enough
+       ;; reason to complain here, because we want DEFCONSTANT to
+       ;; be able to use this function, and it's legal to DEFCONSTANT
+       ;; a constant as long as the new value is EQL to the old
+       ;; value.)
+       ))
 \f
 #|
 ;;; REMOVEME when done testing byte cross-compiler