P: ¿cuál es la forma idiomática de asignar una función a través de una lista de propiedades?
Las diversas funciones de mapeo ( mapcar
y familia) mapean una función sobre una secuencia como una lista. ¿Cómo se usan estas funciones cuando se trata de una lista de propiedades , es decir, cuando se trata de mapear a través de cada una de las propiedades contenidas en la lista (que sería cualquier otro elemento a partir del primero)? Me parece que la función de mapeo necesitaría acceder a la lista en pares de elementos en lugar de como elementos individuales.
Como ejemplo de juguete, ¿cómo se tomaría una lista de propiedades y se recopilarían todos los valores de las propiedades? Si fuera una lista de asociación, sería bastante simple:
(mapcar #'cadr '((:prop1 a) (:prop2 b) (:prop3 c))) ;=> (a b c)
Estoy seguro de que esto podría hacerse con un bucle, pero parece un poco laborioso y me pregunto si hay una forma más idiomática de hacerlo.
mapcar
ejemplo de lista) o si desea asignar sobre los pares de símbolo de propiedad y valor de propiedad. Este último es más general (más útil en general), supongo.Respuestas:
Es probable que obtenga varias
loop
respuestas e iteraciones. AFAIK, no hay forma idiomática de hacer esto. Ni siquiera creo que sea muy común querer acumular solo los valores de propiedad (no asociarlos con las propiedades).Aquí hay una manera simple de hacerlo:
Para el caso más general, donde desea asignar una función binaria sobre un plist:
fuente
Esto probablemente dependerá de una situación. En general, si necesito vincular varios valores con varios nombres, usaría una tabla hash, pero si tengo que usar una lista de propiedades, usaría
cl-loop
. A continuación hay algunos ejemplos:Y si tiene una estructura de datos que muestra en su ejemplo:
fuente
Para mí, la respuesta es convertir el plist en un alist, que es una estructura de datos equivalente, solo la mitad de profunda y más fácil de manipular.
fuente
Con Emacs del Git HEAD actual que se convertirá en Emacs 25, puede hacer lo siguiente, es decir, convertir el plist en una lista fácilmente con la nueva
seq-partition
función, y luego procesar las entradas de la lista usando el estándarmapcar
.Echa un vistazo a los
seq-partition
documentos usandoC-h f seq-partition RET
.fuente
Una idea es utilizar
-map-indexed
desdedash
y aplicar la transformación sólo para valores impares de la lista:Otra idea es convertir un plist en una tabla hash, usando
ht<-plist
fromht
:Tenga en cuenta que la tabla hash no conserva el orden de los elementos.
fuente