T: apa cara idiomatis untuk memetakan suatu fungsi di seluruh daftar properti?
Berbagai fungsi pemetaan ( mapcar
dan keluarga) memetakan fungsi melalui urutan seperti daftar. Bagaimana seseorang menggunakan fungsi-fungsi ini ketika berhadapan dengan daftar properti , yaitu, ketika mencoba memetakan di setiap properti yang ada dalam daftar (yang akan menjadi setiap elemen lainnya mulai dari yang pertama)? Sepertinya saya bahwa fungsi pemetaan perlu mengakses daftar berpasangan elemen daripada sebagai elemen individu.
Sebagai contoh mainan, bagaimana orang akan mengambil daftar properti dan mengumpulkan semua nilai properti? Jika itu adalah daftar asosiasi, itu akan sangat sederhana:
(mapcar #'cadr '((:prop1 a) (:prop2 b) (:prop3 c))) ;=> (a b c)
Saya yakin ini bisa dilakukan dengan loop, tetapi tampaknya sedikit melelahkan dan saya bertanya-tanya apakah ada cara yang lebih idiomatis untuk melakukannya.
mapcar
contoh alist Anda) atau Anda ingin memetakan pasangan simbol properti dan nilai properti. Yang terakhir lebih umum (lebih bermanfaat secara umum), saya kira.Jawaban:
Anda kemungkinan akan mendapatkan berbagai
loop
jawaban dan iterasi. AFAIK, tidak ada cara idiomatis untuk melakukan ini. Saya bahkan tidak berpikir bahwa sangat umum untuk hanya mengakumulasi nilai properti (tidak mengaitkannya dengan properti).Ini adalah salah satu cara mudah untuk melakukannya:
Untuk kasus yang lebih umum, di mana Anda ingin memetakan fungsi biner di atas sebuah plist:
sumber
Ini mungkin tergantung pada suatu situasi. Secara umum, jika saya perlu mengikat sejumlah nilai dengan sejumlah nama, saya akan menggunakan tabel-hash, tetapi jika saya harus menggunakan daftar properti, saya akan menggunakan
cl-loop
. Di bawah ini adalah beberapa contoh:Dan jika Anda memiliki struktur data yang Anda tunjukkan dalam contoh Anda:
sumber
Bagi saya jawabannya adalah mengubah daftar menjadi daftar, yang merupakan struktur data yang setara, hanya setengah dalamnya dan lebih mudah untuk dimanipulasi.
sumber
Dengan Emacs dari Git HEAD saat ini yang akan menjadi Emacs 25, Anda dapat melakukan hal berikut, yaitu mengubah plist menjadi alist dengan mudah dengan
seq-partition
fungsi baru , dan kemudian memproses entri alist menggunakan standarmapcar
.Lihatlah
seq-partition
dokumen yang digunakanC-h f seq-partition RET
.sumber
Satu ide adalah menggunakan
-map-indexed
daridash
dan menerapkan transformasi hanya untuk nilai ganjil dari daftar:Gagasan lain adalah hanya mengonversi plist ke tabel hash, menggunakan
ht<-plist
dariht
:Perhatikan bahwa hash-table tidak mempertahankan urutan item.
sumber