是否可以使用列表作为参数调用 make-array 函数?例如:
(make-array '((length '("a" "b")) (length '("r" "8" "5"))))
返回:
#<TYPE-ERROR expected-type: NUMBER datum: (LENGTH '(...
即使我尝试使用以下命令投射长度的结果:
(coerce (length '(1)) 'number)
适用于一维数组,但不适用于二维数据。
答案 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输出的任何内容作为输入。 (考虑到一些我不会涉及的警告,或者宁愿留给读者练习!)