2010-07-31 14 views
5

Con el cierrepreguntas de cierre (aplicar str)?

(apply str [\a \b]) 

y

(apply str '(\a \b)) 

devuelve "ab".

(apply str (\a \b)) 

devuelve un error.

¿Por qué es eso?

+0

no sé Clojure, pero es posible que [] es una lista, pero() es algo más? – jtbandes

+1

@jtbandes: [] es un vector (piensa como una matriz que crece).() es una lista pero se evalúa como una función si no se cita. Ese es el código de Data Thing alrededor de Lisps. – nickik

Respuesta

14

Debido (\a \b) significa "llamar a la función \a con un argumento de \b", y dado que el carácter \a no es una función, falla. Nótese la diferencia en lo que sigue:

 
user=> (+ 1 2 3) 
6 
user=> '(+ 1 2 3) 
(+ 1 2 3) 

Como regla general, si usted quiere escribir una secuencia literal, utilizar un vector en lugar de una lista citado ya la cita también se detendrá la evaluación de las partes dentro de la lista, por ejemplo:

 
user=> [(+ 1 2) (+ 3 4)] 
[3 7] 
user=> '((+ 1 2) (+ 3 4)) 
((+ 1 2) (+ 3 4))