2014-11-02 188 views
2

我最近开始学习Lisp,我有这个定义函数的简单代码(使用defun),它创建了一个由四个元素组成的数组,然后它将值7到阵列的第一个位置不知道如何为数组赋值

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

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

+2

您错过了函数定义的参数列表部分。 – Barmar 2014-11-02 03:12:07

+1

在任何情况下,(defun)的输出始终是函数名称。如果你(defun add()...),你会得到ADD。 – automaton 2014-11-02 10:17:59

回答

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)))