2012-09-05 13 views
11

Al tratar de resolver el problema 4Clojure "Universal Computation Engine" que implica reimplementar la evaluación, accidentalmente terminó llamando a algo como esto:¿Qué hacen los símbolos Clojure cuando se usan como funciones?

(apply '/ '(16 8)) 

en lugar de la intención:

(apply/'(16 8)) 

Esto tuvo el efecto secundario confuso de regresar 8, lo que me hizo pensar que había estropeado mis matemáticas.

más tarde me di cuenta de mi error después de algún depuración-I estaba fallando para evaluar el símbolo / antes de intentar llamar-y así di cuenta de que clojure.lang.Symbol deben implementar clojure.lang.IFn. Pero, ¿qué hace esa implementación do? Todo lo que puedo hacer es devolver nil con un argumento, o el segundo argumento si es dado.

+0

posible duplicado de [¿Qué sucede cuando paso argumentos a un símbolo de Clojure?] (Http://stackoverflow.com/questions/8219305/what-happens-when-i-pass-arguments-to-a-clojure- símbolo) – amalloy

Respuesta

12

Símbolos miren hasta en un mapa, al igual que las palabras clave. Ver Symbol's implementation:

… 
122 public Object invoke(Object obj) { 
123   return RT.get(obj, this); 
124 } 
125 
126 public Object invoke(Object obj, Object notFound) { 
127   return RT.get(obj, this, notFound); 
128 } 
… 

(.? RT es clojure.lang.RT, lo que hace casi todo "tiempo de ejecución")

En el ejemplo dado, la búsqueda está fallando (porque 16 no es un mapa), y por lo tanto se devuelve el valor notFound (8).

Cuestiones relacionadas