我最近开始学习Lisp,我有这个简单的代码定义了一个函数(使用defun),它创建了一个包含四个元素的数组,然后将值7赋值给数组的第一个位置
(defun func(setf array (make-array '(4))))
(setf (aref array 0) 7)
但它在输出中输出FUNC,为什么呢?
答案 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)))