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)

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))

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.