Відповіді:
Використовуйте cl-map
натомість:
(cl-map 'vector #'1+ [1 2 3 4])
Трохи додаткового тла: cl-map
це загальна map
функція Lisp, яка узагальнює типи послідовностей:
(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-lib
бібліотекою. Я, наприклад, не отримую попереджень, коли я (defun fnx () (cl-map 'vector #'1+ '[1 2 3 4]))
і тоді (byte-compile 'fnx)
.
Оскільки мене побили 18 секунд, ось простіший і безпечніший спосіб зробити це без бібліотеки cl. Він також не оцінює елементи.
(apply #'vector (mapcar #'1+ [1 2 3 4])) ;; => [2 3 4 5]
cl-lib
залежності.
apply
.
(apply #'vector ...)
може бути дещо швидше, але для повноти його також можна замінити (vconcat ...)
.
Не настільки елегантний варіант заміни для випадку, що вихідний вектор після цього більше не потрібен, а розподіл пам’яті є критичним за часом (наприклад, вектор великий).
(setq x [1 2 3 4])
(cl-loop for var across-ref x do
(setf var (1+ var)))
Результат зберігається в x
. Якщо вам потрібна форма для повернення, x
ви можете додати finally return x
наступне:
(cl-loop for var across-ref x do
(setf var (1+ var))
finally return x)
Для повноти використовуючи seq
:
(require 'seq)
(seq-into (seq-map #'1+ [1 2 3 4]) 'vector)
Можна використовувати петлю
(let ((v (vector 1 2 3 4)))
(dotimes (i (length v))
(aset v i (1+ (aref v i))))
v)
;; => [2 3 4 5]
Іноді ви не хочете змінювати оригінальний вектор, ви можете зробити його копію
(let* ((v0 (vector 1 2 3 4))
(v (copy-sequence v0)))
(dotimes (i (length v))
(aset v i (1+ (aref v i))))
(list v0 v))
;; => ([1 2 3 4] [2 3 4 5])
або створити новий вектор з нуля
(let* ((v0 (vector 1 2 3 4))
(v (make-vector (length v0) nil)))
(dotimes (i (length v))
(aset v i (1+ (aref v0 i))))
(list v0 v))
;; => ([1 2 3 4] [2 3 4 5])
cl
бібліотеки не попереджають компілятора? (Переважно тому, що FSF викликає неприємність?)