cl-destructuring-bind su plist parziale?


9

Questo provoca un errore

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

perché la :cchiave / 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-bindnon è appropriato a causa di questa limitazione.

C'è un modo per fare cl-destructuring-bindsemplicemente 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)

Risposte:


10

Poiché cl-destructuring-bindutilizza la convenzione arglist di CommonLisp, dovresti essere in grado di fare:

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

1
Non semplicemente "dovrebbe essere in grado di". In realtà funziona.
Harald Hanche-Olsen,

Ho scritto una macro per renderlo più facile da usare
fommil

Ho riscontrato strani errori non riproducibili con questa macro, è cl-destructuring-bindnoto per avere problemi? github.com/ensime/ensime-emacs/issues/458
fommil

Non credo ci siano problemi noti in cl-destructuring-bind(beh, ci sono alcuni problemi minori ma nessuno che dovrebbe portare a comportamenti errati, AFAIK). OTOH Non sono sicuro di quanto sia stato testato.
Stefan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.