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)