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)
fommil
sumber

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))
Stefan
sumber
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