以下是一个旨在用作 (lifo) 堆栈或 (fifo) 队列的结构
(defstruct jvector
(vector (make-array 0 :adjustable t :fill-pointer 0) :type (array * (*)))
(start 0 :type (integer 0 *)))
内容范围从 jvector-start 到 jvector-vector 填充指针。我希望能够用类似的东西指定内容的元素类型
(defun create-jvector (&key (element-type t))
(make-jvector :vector (make-array 0 :element-type element-type :adjustable t :fill-pointer 0)
:start 0))
并用
(defun push-jvector (elt jvec)
(vector-push-extend elt (jvector-vector jvec)))
但是,create-jvector 中的元素类型被忽略。例如,
* (defparameter v (create-jvector :element-type 'integer))
V
* v
#S(JVECTOR :VECTOR #() :START 0)
* (push-jvector 1 v)
0 ;OK result
* v
#S(JVECTOR :VECTOR #(1) :START 0)
* (push-jvector 'a v)
1 ;not OK result
* v
#S(JVECTOR :VECTOR #(1 A) :START 0)
为什么 push 'a 不会产生类型错误,什么会解决这个问题?