2012-09-05 6 views
11

Beim Versuch, das 4Clojure Problem „Universal Computation Engine“ beteiligt Neuimplementierung Auswertung zu lösen, ich am Ende versehentlich etwas wie dieser Aufruf:Was machen Clojure-Symbole, wenn sie als Funktionen verwendet werden?

(apply '/ '(16 8)) 

anstatt der beabsichtigten:

(apply/'(16 8)) 

Dies hatte die verwirrende Nebenwirkung von der Rückkehr 8, die mich denken ließ, dass ich meine Mathematik durcheinandergebracht hatte.

ich später erkennen meinen Fehler nach einiger Debugging-I das / Symbol bewerten versagen, bevor Sie nennt es-und realisiert, so dass clojure.lang.Symbolclojure.lang.IFn implementieren müssen. Aber was macht diese Implementierung tun? Alles, was ich dazu bringen kann, ist nil mit einem Argument zurückzugeben, oder das zweite Argument, falls angegeben.

+0

mögliche Duplikate von [Was passiert, wenn ich Argumente an ein Clojure-Symbol übergebe?] (Http://stackoverflow.com/questions/8219305/what-happens-when-i-pass-arguments-to-a-clojure- Symbol) – amalloy

Antwort

12

Symbole suchen sich in einer Karte, ähnlich wie Schlüsselwörter. Siehe 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 ist clojure.lang.RT, der so ziemlich alles tut "runtime")

In dem gegebenen Beispiel wird die Lookup-Fehler (weil 16 ist keine Karte), und deshalb Der Wert notFound (8) wird zurückgegeben.

Verwandte Themen