2011-03-26 11 views
7

una pregunta rápida mientras se mira en Clojure ....Clojure Cadena Valores devueltos

Dada la siguiente sesión REPL:

Clojure 1.2.0 
user=> "bar" 
"bar" 
user=> (print "bar") 
barnil 
user=> (defn foo [] ("bar")) 
#'user/foo 
user=> (foo) 
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0) 
user=> (print foo) 
#<user$foo [email protected]>nil 
user=> (print (foo)) 
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn(NO_SOURCE_FILE:0) 

¿Por qué no es la "barra" Cadena mostrado por la función de impresión ? Parece que el lector intenta resolver el valor de retorno de foo (que parece ser una cadena) como una función. ¿Cómo se debe definir que la impresión escriba la cadena en la línea de comandos?

Respuesta

16

Todavía estoy un poco débil en Clojure en comparación con varios otros Lisp-me gusta, pero eso no está bien, ¿verdad? En caso de ser

(defn foo [] "bar") 

de otro modo que haya definido una función que intenta llamar a la cadena "bar" como una función, lo cual es consistente con su error.

mress:10004 Z$ clj 
Clojure 1.2.0 
user=> (defn foo [] "bar") 
#'user/foo 
user=> (foo) 
"bar" 
+0

tuve problemas con la definición de un cwd * * método en la raíz de mi proyecto. Llamar a '(str cwd" src/foo.txt ")' confundió * cwd * como un objeto de función de primera clase, devolviendo '" [email protected]/foo.txt "'. Cambiarlo a '(str (cwd)" src/foo.txt ")' funciona como se esperaba. Ahora entiendo que en un lenguaje imperativo (Python), esta es la diferencia entre la instrucción 'len' y la operación' len() '. – Droogans

6

porque Clojure trata de "resolver" primer elemento de la ninguna lista como el nombre de la función cuando en la llamada función de impresión última DECLARACIÓN Se llama con un argumento lista (foo) instalacciones se interpreta como llamada a la función foo. Hasta aquí todo bien.

pero la función devuelve la lista foo ("bar"), que no se ok..it se interpreta como la llamada a la función "bar" que no está permitido ..

si foo es como (defn foo [] "barra") de lo que funcionará porque la impresión no recibirá ("barra") sino simplemente "barra" y haga la impresión

+0

mmh, 2 respuestas correctas hace 18 minutos :-) Creo que el otro es un poco más describtive, pero todavía :-) 1 – echox

Cuestiones relacionadas