当我使用此函数创建数组时,出现以下错误:
> (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)
您引用的是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)。
| 归档时间: |
|
| 查看次数: |
238 次 |
| 最近记录: |