Satu-satunya hal yang saya temukan yang berhasil adalah
(eval `(vector ,@(mapcar #'1+ [1 2 3 4])))
=> [2 3 4 5]
tapi yang tampaknya jauh terlalu rumit untuk menjadi 'benar' cara.
Satu-satunya hal yang saya temukan yang berhasil adalah
(eval `(vector ,@(mapcar #'1+ [1 2 3 4])))
=> [2 3 4 5]
tapi yang tampaknya jauh terlalu rumit untuk menjadi 'benar' cara.
Jawaban:
Gunakan cl-map
, sebagai gantinya:
(cl-map 'vector #'1+ [1 2 3 4])
Sebuah latar belakang ekstra: cl-map
adalah Common Lisp map
fungsi yang generalizes ke urutan jenis:
(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"
Itu juga dapat mengkonversi antara jenis urutan (misalnya, di sini, input adalah daftar dan output adalah vektor):
(cl-map 'vector #'1+ '(1 2 3 4)) ;; ==> [2 3 4 5]
cl
perpustakaan lama daripada cl-lib
perpustakaan rejiggered . Saya tidak misalnya, mendapatkan peringatan apa pun ketika saya (defun fnx () (cl-map 'vector #'1+ '[1 2 3 4]))
lalu (byte-compile 'fnx)
.
Karena saya dikalahkan 18 detik, inilah cara yang lebih sederhana dan lebih aman untuk melakukannya tanpa pustaka cl. Itu juga tidak mengevaluasi elemen.
(apply #'vector (mapcar #'1+ [1 2 3 4])) ;; => [2 3 4 5]
cl-lib
ketergantungan.
apply
.
(apply #'vector ...)
mungkin sedikit lebih cepat, tetapi untuk kelengkapan, itu juga bisa diganti (vconcat ...)
.
Varian inplace-tidak begitu elegan untuk kasus bahwa vektor asli tidak lagi diperlukan setelah itu dan alokasi memori kritis-waktu (misalnya vektor besar).
(setq x [1 2 3 4])
(cl-loop for var across-ref x do
(setf var (1+ var)))
Hasilnya disimpan di x
. Jika Anda membutuhkan formulir untuk kembali x
pada akhirnya Anda dapat menambahkan finally return x
sebagai berikut:
(cl-loop for var across-ref x do
(setf var (1+ var))
finally return x)
Untuk kelengkapan, gunakan seq
:
(require 'seq)
(seq-into (seq-map #'1+ [1 2 3 4]) 'vector)
Anda bisa menggunakan loop
(let ((v (vector 1 2 3 4)))
(dotimes (i (length v))
(aset v i (1+ (aref v i))))
v)
;; => [2 3 4 5]
Terkadang Anda tidak ingin memodifikasi vektor asli, Anda dapat membuat salinan
(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])
atau buat vektor baru dari awal
(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
perpustakaan memberi peringatan pada kompiler? (Sebagian besar karena FSF menjengkelkan?)