如何在Common Lisp中创建一个多维数组?

时间:2015-02-18 14:09:12

标签: common-lisp

是否可以使用列表作为参数调用 make-array 函数?例如:

(make-array '((length '("a" "b")) (length '("r" "8" "5"))))

返回:

#<TYPE-ERROR expected-type: NUMBER datum: (LENGTH '(...

即使我尝试使用以下命令投射长度的结果:

(coerce (length '(1)) 'number)

适用于一维数组,但不适用于二维数据。

3 个答案:

答案 0 :(得分:6)

  

是否可以使用列表作为参数调用make-array函数?

是的,实际上你总是要传递一个列表指示符,但它必须是整数的列表(或列表指示符)。列表'((length'(“a”“b”))(length'(“r”“8”“5”))))有两个列表作为其元素,而不是整数。例如,如果你做(第一个((长度'(“a”“b”))(长度'(“r”“8”“5”)))))),你会得到< strong>(长度'(“a”“b”)),而不是 2 。你需要做(make-array(list(length ...)(length ...))...)

在HyperSpec中 make-array 的文档中已经非常清楚地描述了这一点:

  

功能MAKE-ARRAY

     

语法:

     

make-array 维度和键元素类型初始元素初始内容可调节填充指针置换为   移位索引偏移

     

=&GT; 新阵列

     

参数和值:

     

维度 - 有效数组维度列表的指示符。

例如,(make-array '(2 2))返回2×2数组。或者,如果您需要动态计算维度,只需列出它们。例如,(make-array (list (length '(a b c)) (length '(d e))))返回3×2阵列。

请注意,参数是指示符以获取列表。词汇表条目说:

  

list designator n。对象列表的指示符;也就是说   表示列表的对象,它是以下之一:非零原子   (表示单元素列表,其元素是非零原子)或a   正确的清单(表示自己)。

这意味着当您执行(make-array 5)时, 5 实际上充当列表的指示符 (5)即可。你真的可以认为 make-array 总是接受一个列表作为第一个参数,但是在单元素列表的情况下,你可以只传递单个元素,因为它是明确的你是什么我想要。

相关

这些是相关的,但并不完全重复,因为它们是关于如何创建列表以传递给 make-array ,而这个问题是关于是否列表可以传递给 make-array

答案 1 :(得分:2)

简单规则1:如果您引用它,则不会对其进行评估。

这是数据,而不是代码:'((length '("a" "b")) (length '("r" "8" "5")))

为什么呢?因为它是引用的。

简单规则2:如果你想计算某些东西,那就写Lisp代码,而不是文字数据。

(list 1 2) -> (1 2)

(list (length '(a b c)) (length '(1 2 3 4))) -> (3 4)

答案 2 :(得分:0)

解决问题的一个未解决方面:与Common Lisp列表非常相似,多维数组也具有文字表示形式,在某些情况下可能很方便。

  • 列表
(list 'a 'b 'c)

;; is equivalent to

'(a b c)
  • 向量(一维数组)表示为#[n](foo*)-n,可选,表示元素数量,foo表示向量中的项,例如
(vector 1 2 3 4)

;; is equivalent to

#4(1 2 3 4)

;; or

#(1 2 3 4)
  • “适当的”多维数组,即大于一维的数组,表示为:#nA<sequence>,其中n是维数,<sequence>的结构类似于嵌套列表,例如
(make-array '(2 3) :initial-contents '((a b c) (d e f)))

;; is equivalent to the following. Note, the 'inner most' array arrays must have the same number of objects, i.e. lisp won't auto-fill them with nil or anything else.

#2A((A B C) (D E F))

但是您不必记住这一点。像许多其他形式一样,Lisp阅读器接受将其打印为make-array输出的任何内容作为输入。 (考虑到一些我不会涉及的警告,或者宁愿留给读者练习!)