Utiliza apply
para convertir una función que funciona en varios argumentos en uno que funciona en una única secuencia de argumentos. También puede insertar argumentos antes de la secuencia. Por ejemplo, map
puede trabajar en varias secuencias. Este ejemplo (de ClojureDocs) usa map
para transponer una matriz.
user=> (apply map vector [[:a :b] [:c :d]])
([:a :c] [:b :d])
El argumento insertado aquí es vector
. Por lo que el apply
expande a
user=> (map vector [:a :b] [:c :d])
lindo!
PS Para devolver un vector de vectores en lugar de una secuencia de vectores, envuelva toda la cosa en vec
:
user=> (vec (apply map vector [[:a :b] [:c :d]]))
Ya que estamos aquí, vec
se podría definir como (partial apply vector)
, aunque no es .
Relativo a Lisp-1 y Lisp-2: el 1 y 2 indican el número de cosas que un nombre puede denotar en un contexto dado. En un Lisp-2, puede tener dos cosas diferentes (una función y una variable) con el mismo nombre. Entonces, donde sea que sea válido, necesitas decorar tu programa con algo que indique a qué te refieres. Afortunadamente, Clojure (o Scheme ...) permite que un nombre denote solo una cosa, por lo que no se necesitan tales decoraciones.
Aquí hay una esencia con el código fuente de la función de aplicar: https://gist.github.com/purplejacket/36de7061061ec9c49734 – Purplejacket