我想知道是否是因为我不了解defparameter宏的核心。
因此,这给出了一个奇怪的错误。我从以下开始:
(defparameter *x* #(1 4 7))
(defparameter *y* #(2 3 55))
一切都很好,但是这样:
(defparameter *res* (make-array * :adjustable t :fill-pointer 0))
犯了一个错误,我根本没有得到:
The value
*Y*
is not of type
(OR (MOD 4611686018427387901) CONS NULL)
when binding SB-VM::DIMENSIONS
[Condition of type TYPE-ERROR]
答案 0 :(得分:4)
CL-USER 28 > (defparameter *y* #(2 3 55))
*Y*
CL-USER 29 > *
*Y*
*
的值是最后一个顶级评估结果的第一个值。
在您的情况下,值为*y*
-一个符号。然后,以该符号作为第一个参数调用MAKE-ARRAY
。 MAKE-ARRAY
不需要符号-因此出现错误:
The value
*Y*
is not of type
(OR (MOD 4611686018427387901) CONS NULL)
when binding SB-VM::DIMENSIONS
[Condition of type TYPE-ERROR]
错误的含义是:符号*y*
既不是数字(具有一定的最大大小)也不是列表。记住*y*
是评估*
的结果。
答案 1 :(得分:3)
关于错误消息中的mod
,它是类型说明符:(mod 4611686018427387901)
的意思是“ 0到4611之间的整数...”,大数字是array-dimension-limit
。
答案 2 :(得分:2)
*
的计算结果为最后计算的值,该值是符号*Y*
的的值,该符号为数组#(2 3 55)
但是make-array
希望它的第一个参数指定它创建的数组 的“维度”:
make-array 尺寸和关键元素类型的initial-element初始内容
可调填充指针从位移到位移索引偏移量=> 新数组
参数和值:
尺寸--- 有效的列表的指示符。
(重点是我的)。有些列表是null
,有些列表是cons
。但不是数组符号。
由于它需要列表designator,即
一个非零原子(表示单个元素列表,其元素是那个非零原子)或适当列表(表示自身)
另一种可能性是整数。