Isso causa um erro
(cl-destructuring-bind
(&key a b)
'(:a "foo" :b 13 :c "bar")
(list a b))
porque a :c
chave / valor não é tratada na correspondência de padrões.
Freqüentemente me vejo querendo extrair algum subconjunto de chaves / valores de uma lista, mas cl-destructuring-bind
não é apropriado por causa dessa limitação.
Existe uma maneira de cl-destructuring-bind
simplesmente ignorar chaves sem correspondência no EXPR? Não sei ao certo qual deveria ser o comportamento oficial do cisco comum aqui, é o erro nas especificações?
Observe que a biblioteca de traços tem algum suporte para uma desestruturação semelhante com -let
, mas isso requer alguns clichês para atribuir um símbolo a cada tecla. Uma correção foi proposta
Levando em conta a resposta de Stefan, isso funciona bem:
(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)