X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fextensions.lisp;h=cde7c9b6315d1a4a275e11742453d7c3d7f314e7;hb=18d4de696bc5063aad026ba62be613c7b07f5fc8;hp=7dd9b959d2794c3bd15659fd479bfcfbd54cca0e;hpb=dccfa0f4e378a267744c03b1416accdf9d888987;p=sbcl.git diff --git a/src/code/extensions.lisp b/src/code/extensions.lisp index 7dd9b95..cde7c9b 100644 --- a/src/code/extensions.lisp +++ b/src/code/extensions.lisp @@ -42,6 +42,12 @@ ;;; 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. @@ -98,7 +104,7 @@ (do ((y x (safe-cddr y)) (started-p nil t) (z x (cdr z))) - ((or (not z) (not y)) nil) + ((not (and (consp z) (consp y))) nil) (when (and started-p (eq y z)) (return t)))))) @@ -538,6 +544,13 @@ (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