不知道如何为数组赋值

时间:2014-11-02 03:05:57

标签: common-lisp

我最近开始学习Lisp,我有这个简单的代码定义了一个函数(使用defun),它创建了一个包含四个元素的数组,然后将值7赋值给数组的第一个位置

(defun func(setf array (make-array '(4))))
(setf (aref array 0) 7)

但它在输出中输出FUNC,为什么呢?

1 个答案:

答案 0 :(得分:3)

一个函数总是需要一个参数列表,即使它是空的

(defun func () ; <- here
  (setf array (make-array '(4)))
  (setf (aref array 0) 7))

评估此表单定义并注册名为func的函数,并返回其注册的符号。这就是为什么你看到FUNC然后,这是正确和预期的。

还有其他问题:

在此处执行(setf array...)时,未定义array。原则上,任何事情都可能发生,但在实践中,将创建和设置一个全局变量,其中可能会或可能不会声明special(即动态范围)。

您应该创建一个局部变量。这通常使用let

完成
(defun func ()
  (let ((array (make-array '(4))))
    (setf (aref array 0) 7)))

这没什么用,因为返回值是setf指定的最后一个值,即7。你很可能想要返回数组:

(defun func ()
  (let ((array (make-array '(4))))
    (setf (aref array 0) 7))
    array))

请注意,元素1,2和3未初始化,因此尝试从中读取它们之后会有未定义的行为(当然,除非您先设置它们的值)。如果您希望将数组视为仅填充到第一个元素,则可以使用fill-pointer

(defun func ()
  (let ((array (make-array 4 :fill-pointer 0)))
    (vector-push 7 array)
    array))

如果您只需要array的确切结构,则可以复制文字:

(defun func ()
  (copy-seq #(7 0 0 0)))