如何正确指定可扩展向量的common-lisp类型(即,vector-push-extend可接受),因此可以复制它.例如,如果向量定义为:
(defparameter v (make-array 2 :initial-contents '((a (b)) (c (d) e)) :adjustable t :fill-pointer t))
我复制它的简单(不正确)方法是:
(map 'array #'copy-tree v)
但这会在sbcl中生成一个类型错误.一个正确的序列类型规范可以使这个工作吗?
你可以这样做:
(map (type-of v) #'copy-tree v)
什么类型?
CL-USER> (type-of v) (VECTOR T 2)
以下就足够了:
(map 'vector #'copy-tree v)
此图有助于记住类型层次结构,尤其是数组和向量.
但是,得到的矢量不可调整.也许这样的事情可以帮助:
(defun my-copy (vector) (map-into (make-array (array-dimensions vector) :adjustable (adjustable-array-p vector) :fill-pointer (fill-pointer vector)) #'copy-tree vector))