cl-destructuring-bind en plist parcial?

9

Esto causa un error

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

porque la :cclave / 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-bindno es apropiado debido a esta limitación.

¿Hay alguna manera de cl-destructuring-bindsimplemente 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)
fommil
fuente

Respuestas:

10

Como cl-destructuring-bindusa la convención de arglistas de CommonLisp, debería poder hacer:

(cl-destructuring-bind 
    (&key a b &allow-other-keys) 
    '(:a "foo" :b 13 :c "bar") 
  (list a b))
Stefan
fuente
1
No simplemente "debería poder". Realmente funciona.
Harald Hanche-Olsen
Escribí una macro para que sea más fácil de usar
fommil
He estado recibiendo algunos errores extraños no reproducibles con esta macro, ¿se cl-destructuring-bindsabe que tiene algún problema? github.com/ensime/ensime-emacs/issues/458
fommil
No creo que haya problemas conocidos en cl-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.
Stefan