Esto causa un error
(cl-destructuring-bind
(&key a b)
'(:a "foo" :b 13 :c "bar")
(list a b))
porque la :c
clave / valor no se maneja en la coincidencia de patrón.
A menudo me encuentro con ganas de extraer algún subconjunto de claves / valores de un plist, pero cl-destructuring-bind
no es apropiado debido a esta limitación.
¿Hay alguna manera de cl-destructuring-bind
simplemente ignorar las claves no coincidentes en el EXPR? No estoy seguro de qué se supone que es el comportamiento oficial común de ceceo aquí, ¿es el error en la especificación?
Tenga en cuenta que la biblioteca de guiones tiene cierto soporte para una desestructuración similar -let
, pero eso requiere un poco de repetitivo para asignar un símbolo a cada tecla. Se ha propuesto una solución.
Teniendo en cuenta la respuesta de Stefan, esto funciona 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)
fuente
cl-destructuring-bind
sabe que tiene algún problema? github.com/ensime/ensime-emacs/issues/458cl-destructuring-bind
(bueno, hay algunos problemas menores pero ninguno que debería conducir a un comportamiento incorrecto, AFAIK). OTOH No estoy seguro de cuánto se ha probado.