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

Xav*_*ing 1 common-lisp

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

(make-array '((length '("a" "b")) (length '("r" "8" "5"))))
Run Code Online (Sandbox Code Playgroud)

返回:

#<TYPE-ERROR expected-type: NUMBER datum: (LENGTH '(...
Run Code Online (Sandbox Code Playgroud)

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

(coerce (length '(1)) 'number)
Run Code Online (Sandbox Code Playgroud)

它适用于一维数组但不适用于二维数组.

Jos*_*lor 6

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

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

在HyperSpec的make-array文档中已经很清楚地描述了它:

功能MAKE-ARRAY

句法:

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

=> new-array

论点和价值观:

dimensions - 一个有效数组维列表的指示符.

例如,(make-array '(2 2))返回2×2阵列.或者,如果您需要动态计算维度,只需它们列在一起即可.例如,(make-array (list (length '(a b c)) (length '(d e))))返回一个3×2阵列.

请注意,参数是列表的指示符.词汇表条目说:

列表标志 ñ.对象列表的指示符; 也就是说,一个表示列表的对象,它是以下之一:非零原子(表示单元素列表,其元素是非零原子)或正确的列表(表示自身).

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

有关

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