2010-07-22 14 views
7

si tengo una lista de funciones:aplicar en primer lugar de una lista de funciones en Clojure

(def lst '(+ -))

y Deseo solicitar el primero de esa lista (+) para una lista de números, lo haría Pienso su

(apply (first lst) '(1 2 3 4))

pero al parecer U estoy equivocado? Error de sintaxis, supongo. ¿Cómo hago esto?

PS:

=>(first lst) 
+ 

=>(apply (first lst) '(1 2 3 4)) 
4 

tanto la rentabilidad sin error, que acaba de regresar lo que se espera en el primer caso, y lo que yo no esperaría que en el segundo.

Respuesta

13

Debido a que su lista se cita:

(def lst '(+ -)) 
     ; ^- quote! 

sus miembros son dos símbolos , no funciones. Un símbolo en Clojure se puede utilizar como una función, pero luego se actúa muy parecido a una palabra (es decir, se ve a sí misma en su argumento):

('foo {'foo 1}) 
; => 1 

La solución correcta es utilizar una lista - o, más idiomático, un vector - de las funciones:

(def lst (list + -)) ; ok 
; or... 
(def lst `(~+ ~-)) ; very unusual in Clojure 
; or... 
(def lst [+ -])  ; the idiomatic solution 

Luego, su ejemplo apply funcionará.

Por cierto, observe que una función, cuando se imprime vuelta por el REPL, no se ve como el símbolo que lo nombra:

user=> + 
#<core$_PLUS_ [email protected]> 
+0

Ahhhhhh. eso tiene mucho sentido ahora. solo tenía que escucharlo de alguien que sabía lo que estaban haciendo. muchas gracias. – trh178

Cuestiones relacionadas