Saya belum menemukan fungsi perpustakaan Elisp standar untuk menggabungkan dua daftar properti, seperti ini:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Saya dapat membangun sesuatu dengan dolist
, tetapi sebelum saya melakukannya, saya ingin memeriksa bahwa saya tidak mengabaikan fungsi yang ada di beberapa perpustakaan.
Pembaruan, berdasarkan komentar :
- Menanggapi komentar "banyak cara":
Saya akan membayangkan bahwa tidak ada fungsi seperti itu karena ada jawaban yang berbeda (dan mungkin valid) untuk pertanyaan: apa yang harus dilakukan ketika Anda memiliki nama properti duplikat dengan nilai yang berbeda?
Ya, ada pertanyaan tentang cara menggabungkan duplikat, tetapi ada beberapa cara untuk mengatasinya. Saya melihat dua pendekatan umum. Pertama, urutan argumen dapat menyelesaikan duplikat; mis. kemenangan paling kanan, seperti pada gabungan Clojure . Kedua, penggabungan dapat mendelegasikan ke fungsi panggilan balik yang disediakan pengguna, seperti dalam gabungan Ruby .
Bagaimanapun, fakta bahwa ada berbagai cara untuk melakukannya tidak mencegah banyak perpustakaan standar bahasa lainnya menyediakan fungsi penggabungan. Argumen umum yang sama dapat dikatakan tentang penyortiran, namun Elisp menyediakan fungsi penyortiran.
- "Bisakah kamu menguraikan?" / "Silakan tentukan perilaku yang Anda cari dengan tepat."
Secara umum, saya terbuka untuk apa yang digunakan oleh komunitas Elisp. Jika Anda ingin contoh tertentu, berikut ini akan menjadi salah satu contoh yang berfungsi:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
Dan kembali
'(k1 1 k2 2 k3 0))
Ini akan menjadi gaya kemenangan paling kanan, seperti gabungan Clojure.
- "Itu daftar, jadi tambahkan saja?"
Tidak, append
tidak memelihara semantik daftar properti . Ini:
(append '(k1 1 k2 2) '(k2 0))
Mengembalikan ini:
(k1 1 k2 2 k2 0)
append adalah fungsi bawaan di `kode sumber C '.
(tambahkan & sisanya URUTAN)
Gabungkan semua argumen dan buat hasilnya daftar. Hasilnya adalah daftar yang elemen-elemennya adalah elemen dari semua argumen. Setiap argumen dapat berupa daftar, vektor, atau string. Argumen terakhir tidak disalin, hanya digunakan sebagai ekor dari daftar baru.
- "Dan contoh Anda tidak menampilkan sesuatu seperti gabungan - bahkan tidak menampilkan dua daftar properti."
Ya itu benar; itu menggabungkan langkah demi langkah. Ini menunjukkan bagaimana melakukan penggabungan menggunakan fungsi daftar properti Elisp yang didokumentasikan sangat menyakitkan:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
Cukup tampilkan nilai output yang dihasilkan dari pl
:
(key-1 value-1 key-2 value-2)
Untuk mengulangi, saya mampu menulis fungsi untuk menyelesaikan masalah ini, tetapi saya pertama-tama ingin mencari tahu apakah fungsi tersebut ada di suatu tempat yang umum digunakan.
Akhirnya, jika Anda menolak pertanyaan karena ternyata tidak jelas, saya akan meminta Anda mempertimbangkan kembali sekarang karena saya telah berupaya untuk mengklarifikasi. Ini bukan kurangnya penelitian. Dokumentasi Elisp pada "Daftar" tidak menjawab pertanyaan.
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
yang sama (:a 3 :b 2 :a 1)
selama Anda hanya menggunakan fungsi plist untuk mengakses daftar.
plist-get
tidak plist-member
peduli atau ada beberapa kunci identik. Sepertinya mereka berperilaku analog ke alists dalam hal ini: (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
. Sementara itu, (plist-put '(:a "a" :b "b" :a "c") :a "d")
mengganti nilai :a
kunci pertama tetapi bukan yang kedua.
append
?