LISP创建阵列

1 lisp arrays common-lisp

当我使用此函数创建数组时,出现以下错误:

> (defun f1(lst)
   (setf m (make-array '((length lst) 3))))
F1
> (f1 '(1 2 3))
Error: Not a nonnegative integer - (LENGTH LST)    
Run Code Online (Sandbox Code Playgroud)

列表的长度应为非负整数,在这种情况下为3,那么为什么会出现此错误,我该怎么办?

> (length '(1 2 3))
3
Run Code Online (Sandbox Code Playgroud)

Ren*_*nzo 5

您引用的是list ((length lst) 3))),因此其值为((LENGTH LST) 3))),其中第一个元素不是数字,而是两个符号的列表。

改用list构建一个新列表,在该列表中评估第一个参数:

CL-USER> (defun f1(lst) 
           (setf m (make-array (list (length lst) 3))))
F1
CL-USER> (f1 '(1 2 3))
#2A((0 0 0) (0 0 0) (0 0 0))
Run Code Online (Sandbox Code Playgroud)

在Lisp语言中'((A) 3)是的缩写(QUOTE ((A) 3)),评估为((A) 3)。另一方面,(list (A) 3)定期进行评估(A),对函数的调用进行评估A,并最终生成列表(value-of-calling-a 3)