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
しかし、コンパイラーは、定義されたシンボルをリテラル値で置き換えることができると思っていました。これが の目的の 1 つであると私は考えたでしょうdefconstant
。(これまでのところ、Common Lisp Hyperspec、CLTL2、SBCL マニュアル、または Google が発見したものから、この問題をより深く理解することに成功していません。何らかの形で答えがあると思います ....)