Cela provoque une erreur
(cl-destructuring-bind
(&key a b)
'(:a "foo" :b 13 :c "bar")
(list a b))
car la :c
clé / valeur n'est pas gérée dans la correspondance de modèle.
Souvent, je me retrouve à vouloir extraire un sous-ensemble de clés / valeurs d'un plist, mais ce cl-destructuring-bind
n'est pas approprié en raison de cette limitation.
Existe-t-il un moyen de cl-destructuring-bind
simplement ignorer les clés sans correspondance dans l'EXPR? Je ne sais pas quel est le comportement officiel de lisp commun censé être ici, est-ce l'erreur dans la spécification?
Notez que la bibliothèque de tirets prend en charge une déstructuration similaire avec -let
, mais cela nécessite un passe-partout pour attribuer un symbole à chaque clé. Un correctif a été proposé
Compte tenu de la réponse de Stefan, cela fonctionne bien:
(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)
la source
cl-destructuring-bind
connu pour avoir des problèmes? github.com/ensime/ensime-emacs/issues/458cl-destructuring-bind
(enfin, il y a quelques problèmes mineurs mais aucun qui devrait conduire à un comportement incorrect, AFAIK). OTOH Je ne sais pas à quel point il a été testé.