defparameter的使用

时间:2018-10-10 09:17:37

标签: global-variables lisp common-lisp read-eval-print-loop

我想知道是否是因为我不了解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]

3 个答案:

答案 0 :(得分:4)

CL-USER 28 > (defparameter *y* #(2 3 55))
*Y*

CL-USER 29 > *
*Y*

*的值是最后一个顶级评估结果的第一个值。

在您的情况下,值为*y*-一个符号。然后,以该符号作为第一个参数调用MAKE-ARRAYMAKE-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,即

  

一个非零原子(表示单个元素列表,其元素是那个非零原子)或适当列表(表示自身)

另一种可能性是整数。