0.pre7.5:
[sbcl.git] / src / code / extensions.lisp
index da44a34..cde7c9b 100644 (file)
 ;;; bound because ANSI specifies it as an exclusive bound.)
 (def!type index () `(integer 0 (,sb!xc:array-dimension-limit)))
 
+;;; like INDEX, but augmented with -1 (useful when using the index
+;;; to count downwards to 0, e.g. LOOP FOR I FROM N DOWNTO 0, with
+;;; an implementation which terminates the loop by testing for the
+;;; index leaving the loop range)
+(def!type index-or-minus-1 () `(integer -1 (,sb!xc:array-dimension-limit)))
+
 ;;; the default value used for initializing character data. The ANSI
 ;;; spec says this is arbitrary. CMU CL used #\NULL, which we avoid
 ;;; because it's not in the ANSI table of portable characters.
        (t
         (error "not legal as a function name: ~S" function-name))))
 
+(defun looks-like-name-of-special-var-p (x)
+  (and (symbolp x)
+       (let ((name (symbol-name x)))
+        (and (> (length name) 2) ; to exclude '* and '**
+             (char= #\* (aref name 0))
+             (char= #\* (aref name (1- (length name))))))))
+
 ;;; 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