Как мне сделать динамический вектор простым вектором в Common Lisp? - PullRequest
1 голос
/ 23 марта 2011

Я хочу использовать векторы с: adaptable и: fill-pointer, установленным в значение true, чтобы помещать объекты на них, но как только я закончу добавлять объекты, я хочу использовать svref для них для более быстрого доступа.Есть ли хороший способ превратить этот вид вектора в простой вектор?

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

См. COERCE.

CL-USER> (defvar *xxx*)
*XXX*                                                                                                                                                                               
CL-USER> (setf *xxx* (make-array 5 :element-type '(unsigned-byte 8) :initial-element 1 :adjustable t))
#(1 1 1 1 1)                                                                                                                                                                        
CL-USER> *xxx*
#(1 1 1 1 1)                                                                                                                                                                        
CL-USER> (type-of *xxx*)
(AND (VECTOR (UNSIGNED-BYTE 8) 5) (NOT SIMPLE-ARRAY))                                                                                                                               
CL-USER> (coerce *xxx* 'simple-vector)
#(1 1 1 1 1)                                                                                                                                                                        
CL-USER> (type-of *)
(SIMPLE-VECTOR 5)
2 голосов
/ 23 марта 2011

Вы не можете отменить настройку и наличие указателя заполнения векторного объекта, но вы можете скопировать его содержимое в новый вектор:

(make-array (array-dimensions my-adjustable-vector)
    :element-type (array-element-type my-adjustable-vector)
    :initial-contents my-adjustable-vector)

, который не может быть (явно) настроен или имеет указатель заполнения. Является ли это на самом деле выигрышем в производительности - это включает в себя оплату авансовых затрат на создание нового массива и копирование элементов, либо либо освобождение старого, либо (если есть другие ссылки на него), сохраняя оба - воля Конечно, зависит от вашей заявки.

...