Единственное, что я нашел, это работает
(eval `(vector ,@(mapcar #'1+ [1 2 3 4])))
=> [2 3 4 5]
но кажется , что далеко слишком сложно , чтобы быть «правильный» путь.
Используйте cl-map
вместо этого:
(cl-map 'vector #'1+ [1 2 3 4])
Немного дополнительного фона: cl-map
это функция Common Lisp,map
которая обобщает типы последовательностей:
(cl-map 'vector #'1+ '[1 2 3 4]) ;; ==> [2 3 4 5]
(cl-map 'list #'1+ '(1 2 3 4)) ;; ==> (2 3 4 5)
(cl-map 'string #'upcase "abc") ;; ==> "ABC"
Он также может преобразовывать типы последовательностей (например, здесь вход является списком, а выход - вектором):
(cl-map 'vector #'1+ '(1 2 3 4)) ;; ==> [2 3 4 5]
cl
библиотеки не выдают предупреждения компилятора? (Главным образом потому, что ФСФ противна?)cl
библиотекой, а не с перенастроеннойcl-lib
библиотекой. Я, например, не получаю никаких предупреждений, когда я,(defun fnx () (cl-map 'vector #'1+ '[1 2 3 4]))
а затем(byte-compile 'fnx)
.Поскольку меня избили 18 секунд, вот более простой и безопасный способ сделать это без библиотеки cl. Это также не оценивает элементы.
источник
cl-lib
зависимости.apply
.(apply #'vector ...)
может быть немного быстрее, но для полноты его также можно заменить на(vconcat ...)
.Не очень элегантный вариант на месте для случая, когда исходный вектор больше не нужен, а распределение памяти критично ко времени (например, вектор большой).
Результат сохраняется в
x
. Если вам нужна форма для возвратаx
в конце, вы можете добавитьfinally return x
следующее:источник
Для полноты, используя
seq
:источник
seq-into
строкой. Пользователь удалил свой ответ по следующей причине: «Мое решение менее актуально, потому что библиотека seq использует базовые расширения Common Lisp. - Fólkvangr 16 мая в 8:53»Вы можете использовать цикл
Иногда вы не хотите изменять исходный вектор, вы можете сделать копию
или создайте новый вектор с нуля
источник