至少 Common Lisp 的某些实现不允许用户定义的常量在某些类型说明符中用作数组维度。例如,在 SBCL 中,此代码:
(defconstant +len+ 3)
(defun foo (x)
(declare (type (simple-array fixnum (+len+)) x))
x)
生成此错误:
; in: DEFUN FOO
; (TYPE (SIMPLE-ARRAY FIXNUM (+LEN+)) X)
;
; caught ERROR:
; bad dimension in array type: +LEN+
为什么?用户定义的常量不能在类型说明符中使用似乎令人惊讶,因为希望能够使用某种全局定义来协调多个类型说明符。我知道类型说明符需要在编译时完全可以理解。但我原以为编译器能够替换用defconstant
其文字值定义的符号。我会认为这是defconstant
. (到目前为止,我一直未能从 Common Lisp Hyperspec、CLTL2、SBCL 手册或谷歌提供的内容中更深入地理解这个问题。我怀疑答案是以某种形式存在的......)