Vector 为什么这个lisp向量没有扩展?

Vector 为什么这个lisp向量没有扩展?,vector,common-lisp,sbcl,Vector,Common Lisp,Sbcl,我试图使用SBCL在CommonLisp中创建一个node对象,该对象使用文本元素初始化,然后具有到其他节点的链接。我的函数链接应该取节点“from_node”,获取其成员链接(应该是可变/可扩展的向量),并将节点推入“to_node” 我编译say.lisp,创建两个表示节点的全局变量,然后尝试链接这两个节点。我犯了一个错误 这是say.lisp (defclass node () ((text :initarg :text) (links :initform (

我试图使用SBCL在CommonLisp中创建一个node对象,该对象使用文本元素初始化,然后具有到其他节点的链接。我的函数链接应该取节点“from_node”,获取其成员链接(应该是可变/可扩展的向量),并将节点推入“to_node”

我编译say.lisp,创建两个表示节点的全局变量,然后尝试链接这两个节点。我犯了一个错误

这是say.lisp

(defclass node ()
  ((text
     :initarg :text)
   (links
     :initform (make-array 1 :adjustable t))))

(defun link (from_node to_node)
  (vector-push-extend to_node (slot-value from_node 'links)))
然后在REPL中

* (load "say.lisp")  
T
* (defvar *x* (make-instance 'node :text "hello world"))

*X*
* (defvar *y* (make-instance 'node :text "bye world"))  

*Y*
* (link *x* *y*)

debugger invoked on a TYPE-ERROR in thread
#<THREAD "main thread" RUNNING {1003016593}>:
  The value #() is not of type (AND VECTOR (NOT SIMPLE-ARRAY)).

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(VECTOR-PUSH-EXTEND #<NODE {10031D3983}> #() NIL)
0] 
*(加载“say.lisp”)
T
*(defvar*x*(生成实例节点:文本“hello world”))
*X*
*(defvar*y*(生成实例节点:文本“bye world”))
*Y*
*(链接*x**y*)
在线程中的类型错误上调用调试器
#:
值#()不是类型(和向量(不是简单数组))。
键入“帮助”以获取调试器帮助,或键入(SB-EXT:EXIT)以退出SBCL。
重新启动(可通过数字或可能的缩写名称调用):
0:[中止]退出调试器,返回顶层。
(向量推式扩展##()零)
0] 
起初我以为我是在制作一个不可变的向量,但“:adjustable t”应该可以让它工作

有什么不对?

要求向量参数是“带填充指针的向量”。将:可调t传递给生成数组可以使其可调,但不给它填充指针。例如,如果没有填充指针:

CL-USER> (defparameter *x* (make-array 1 :adjustable t))
*X*
CL-USER> *x*
#(0)
CL-USER> (vector-push-extend 3 *x*)
; Evaluation aborted on #<SIMPLE-TYPE-ERROR expected-type:
                    (AND VECTOR (SATISFIES ARRAY-HAS-FILL-POINTER-P))
                    datum: #<(VECTOR T 1) {100464C57F}>>.

这是一个重要的区别,因为您可以使用不带填充指针的可调数组,正如您所看到的。这些元素可以调整大小,但总是显示为具有与空间相同的元素。(例如,在第一种情况下,*x*具有长度一个。您也可以使用数组来填充不可调整的指针。这将允许您在填充之前使用向量推送向量推送扩展,但之后无法调整大小。

谢谢,该函数没有ave“下一个要填补的职位”
CL-USER> (defparameter *x* (make-array 1 :adjustable t :fill-pointer 0))
*X*
CL-USER> *x*
#()
CL-USER> (vector-push-extend 3 *x*)
0
CL-USER> (vector-push-extend 4 *x*)
1
CL-USER> (vector-push-extend 5 *x*)
2
CL-USER> *x*
#(3 4 5)