DECLARE-ARRAY-TYPE-ELEMENT-REFERENCESTHE form.DEFVAR *ONE-ARRAY* (MAKE-ARRAY 10 :ELEMENT-TYPE '(SIGNED-BYTE 5))) (DEFVAR *ANOTHER-ARRAY* (MAKE-ARRAY 10 :ELEMENT-TYPE '(SIGNED-BYTE 8)))
(DEFUN FROB (AN-ARRAY) (DECLARE (TYPE (ARRAY (SIGNED-BYTE 5) 1) AN-ARRAY)) (SETF (AREF AN-ARRAY 1) 31) ; OK (SETF (AREF AN-ARRAY 2) 127) ; Should signal an error (SETF (AREF AN-ARRAY 3) (* 2 (AREF AN-ARRAY 3))) ; Run-time decision needed (LET ((FOO 0)) (DECLARE (TYPE (SIGNED-BYTE 5) FOO)) (SETF FOO (AREF AN-ARRAY 0)))) ; Declared to be safe
(FROB *ONE-ARRAY*) ; Legal call, should signal an error (FROM *ANOTHER-ARRAY*) ; Is probably an undetectable error
Note that the above definition of FROB is equivalent to:
(DEFUN FROB (AN-ARRAY) (DECLARE (TYPE (ARRAY (SIGNED-BYTE 5) 1) AN-ARRAY)) (SETF (THE (SIGNED-BYTE 5) (AREF AN-ARRAY 1) 31)) (SETF (THE (SIGNED-BYTE 5) (AREF AN-ARRAY 2) 127)) (SETF (THE (SIGNED-BYTE 5) (AREF AN-ARRAY 3)) (* 2 (THE (SIGNED-BYTE 5) (AREF AN-ARRAY 3)))) (LET ((FOO 0)) (DECLARE (TYPE (SIGNED-BYTE 5) FOO)) (SETF FOO (THE (SIGNED-BYTE 5) (AREF AN-ARRAY 0)))))
Given an implementation in which fixnums are 29 bits but fixnum arrays are upgraded to signed 32-bit arrays, the following should be compiled with all fixnum arithmetic:
(DEFUN BUMP-COUNTERS (COUNTERS) (DECLARE (TYPE (ARRAY FIXNUM *) BUMP-COUNTERS)) (DOTIMES (I (LENGTH COUNTERS)) (INCF (AREF COUNTERS I))))
TBSARRAY-TYPE-ELEMENT-TYPE-SEMANTICS, which deals with array type specifiers as they refer to arrays as a whole.
This proposal is consistent with SYMBOL-MACROLET-DECLARE:ALLOW and DECLARATION-SCOPE:LEXICAL.
TBS