Я пытаюсь создать объект узла в Common Lisp, используя SBCL, который инициализируется его текстовым элементом, а затем имеет ссылки на другие узлы. Предполагается, что моя функциональная ссылка займет узел «from_node», получит его членские ссылки (которые должны быть изменяемым/расширяемым вектором) и нажмите на узел «to_node».Почему этот lisp-вектор не распространяется?
Скомпилировать say.lisp, создать 2 глобальных переменных, которые представляют узлы, а затем попытаться связать эти два узла. Я получаю сообщение об ошибке
Вот 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]
Первоначально я думал, что я делал неизменный вектор, но «: регулируемый т» должен позволить этому работать.
Что не так?
Спасибо, функция не имела «следующего положения для заполнения», – SlightlyCyborg