2
我最近开始学习Lisp,我有这个定义函数的简单代码(使用defun),它创建了一个由四个元素组成的数组,然后它将值7到阵列的第一个位置不知道如何为数组赋值
(defun func(setf array (make-array '(4))))
(setf (aref array 0) 7)
但它在输出中打印FUNC,为什么?
我最近开始学习Lisp,我有这个定义函数的简单代码(使用defun),它创建了一个由四个元素组成的数组,然后它将值7到阵列的第一个位置不知道如何为数组赋值
(defun func(setf array (make-array '(4))))
(setf (aref array 0) 7)
但它在输出中打印FUNC,为什么?
函数总是需要一个参数列表,即使它是空的
(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)))
您错过了函数定义的参数列表部分。 – Barmar 2014-11-02 03:12:07
在任何情况下,(defun)的输出始终是函数名称。如果你(defun add()...),你会得到ADD。 – automaton 2014-11-02 10:17:59