Misalkan saya punya daftar assoc seperti ini:
(setq x '((foo . ((bar . "llama")
(baz . "monkey")))))
Dan saya ingin nilainya bar
. Aku bisa melakukan ini:
(assoc-default 'bar (assoc-default 'foo x))
Tapi yang saya benar-benar suka adalah sesuatu yang menerima banyak kunci
(assoc-multi-key 'foo 'bar x)
Apakah hal semacam itu ada, mungkin dalam suatu paket di suatu tempat? Saya yakin saya bisa menulisnya, tetapi saya merasa Google-fu saya gagal dan saya tidak dapat menemukannya.
elisp
association-lists
abingham
sumber
sumber
assoc-multi-key
. Agaknya ia mencari kecocokan dengan kedua argumen pertama, tapi hanya itu yang bisa diduga, dari apa yang Anda katakan. Dan jelas tidak dapat menerima lebih dari dua kunci, karena argumen alist (mungkinx
) adalah yang terakhir, bukan yang pertama - yang menunjukkan bahwa itu tidak terlalu berguna secara umum. Cobalah sebutkan apa yang Anda cari.setq
formulir dalam contoh membingungkan, jadi saya mengeditnya untuk menggunakan notasi titik umum untuk daftar-assoc.assoc-multi-key
tetap tidak ditentukan.assoc-multi-key
adalah mencari kunci pertama dalam daftar asosiasi. Ini harus menyelesaikan ke daftar asosiasi baru di mana kita mencari kunci selanjutnya. Dan seterusnya. Pada dasarnya pekerjaan singkat untuk menggali nilai dari daftar assoc-nested.let-alist
juga? misalnya(let-alist '((foo . ((bar . "llama") (baz . "monkey")))) .foo.bar)
akan kembali"llama"
. Saya kira Anda menulislet-alist
setelah pertanyaan diajukan, tetapi itu dalam semangat pertanyaan dan sangat layak disebut IMO!Jawaban:
Berikut adalah opsi yang menggunakan sintaksis persis yang Anda minta tetapi dengan cara umum, dan cukup mudah dimengerti. Satu-satunya perbedaan adalah bahwa
ALIST
parameter perlu diutamakan (Anda dapat menyesuaikannya untuk menjadi yang terakhir, jika itu penting bagi Anda).Maka Anda dapat menyebutnya dengan:
sumber
Inilah solusi yang lebih umum:
Itu bisa mengambil "jalur" kunci apa saja. Ini akan kembali
(bar . "llama")
sedangkan ini akan kembali
(baz . "monkey")
:sumber
Berikut adalah fungsi sederhana yang bekerja dengan daftar alist di dalam daftar alist lain:
sumber