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.
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 memberi peringatan pada kompiler? (Sebagian besar karena FSF menjengkelkan?)cl
perpustakaan lama daripadacl-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.
sumber
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).
Hasilnya disimpan di
x
. Jika Anda membutuhkan formulir untuk kembalix
pada akhirnya Anda dapat menambahkanfinally return x
sebagai berikut:sumber
Untuk kelengkapan, gunakan
seq
:sumber
seq-into
baris yang sama persis . Pengguna telah menghapus jawabannya karena alasan berikut: "Solusi saya kurang relevan karena perpustakaan seq menggunakan ekstensi Common Lisp yang mendasarinya. - Fólkvangr 16 Mei pukul 8:53"Anda bisa menggunakan loop
Terkadang Anda tidak ingin memodifikasi vektor asli, Anda dapat membuat salinan
atau buat vektor baru dari awal
sumber