Questo provoca un errore
(cl-destructuring-bind
(&key a b)
'(:a "foo" :b 13 :c "bar")
(list a b))
perché la :c
chiave / valore non viene gestita nella corrispondenza del modello.
Spesso mi ritrovo a voler estrarre un sottoinsieme di chiavi / valori da un plist, ma cl-destructuring-bind
non è appropriato a causa di questa limitazione.
C'è un modo per fare cl-destructuring-bind
semplicemente ignorare le chiavi senza eguali in EXPR? Non sono sicuro di quale sia il comportamento lisp comune ufficiale dovrebbe essere qui, l'errore è nelle specifiche?
Si noti che la dash dash ha un certo supporto per una simile destrutturazione con -let
, ma che richiede un po 'di boilerplate per assegnare un simbolo a ciascun tasto. È stata proposta una correzione
Tenendo conto della risposta di Stefan, questo funziona bene:
(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)