cl-destrruction-bind pada partial plist?


9

Ini menyebabkan kesalahan

(cl-destructuring-bind 
    (&key a b) 
    '(:a "foo" :b 13 :c "bar") 
  (list a b)) 

karena :ckunci / nilai tidak ditangani dalam kecocokan pola.

Seringkali saya mendapati diri saya ingin mengekstrak beberapa subset kunci / nilai dari sebuah plist, tetapi cl-destructuring-bindtidak sesuai karena keterbatasan ini.

Apakah ada cara untuk cl-destructuring-bindmengabaikan kunci yang tidak cocok di EXPR? Saya tidak yakin apa yang seharusnya menjadi perilaku umum lumpuh resmi di sini, apakah kesalahan dalam spesifikasi?

Perhatikan bahwa pustaka dasbor memiliki beberapa dukungan untuk penghancuran serupa dengan -let, tetapi itu membutuhkan beberapa pelat untuk menetapkan simbol untuk setiap kunci. Sebuah memperbaiki telah diusulkan

Memperhatikan jawaban Stefan, ini bekerja dengan baik:

(defmacro plist-bind (args expr &rest body)
  "`destructuring-bind' without the boilerplate for plists."
  `(cl-destructuring-bind
       (&key ,@args &allow-other-keys)
       ,expr
     ,@body))

(plist-bind
  (a b)
 '(:a "foo" :b 13 :c "bar")
 (list a b)) => ("foo" 13)

Jawaban:


10

Karena cl-destructuring-bindmenggunakan konvensi arglist CommonLisp, Anda seharusnya dapat melakukan:

(cl-destructuring-bind 
    (&key a b &allow-other-keys) 
    '(:a "foo" :b 13 :c "bar") 
  (list a b))

1
Bukan sekadar "harus bisa". Ini benar-benar bekerja.
Harald Hanche-Olsen

Saya menulis makro untuk membuatnya lebih mudah digunakan
fommil

Saya mendapatkan beberapa kesalahan aneh yang tidak dapat direproduksi dengan makro ini, apakah cl-destructuring-binddiketahui ada masalah? github.com/ensime/ensime-emacs/issues/458
fommil

Saya tidak berpikir ada masalah yang diketahui di cl-destructuring-bind(well, ada beberapa masalah kecil tapi tidak ada yang mengarah pada perilaku yang salah, AFAIK). OTOH Saya tidak yakin seberapa berat pengujiannya.
Stefan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.