Folgende Interaktion mit der Clojure-REPL ist für einen Common Lisper wie mich einigermaßen verblüffend:

user> `fn  
clojure/fn  
user> (macroexpand '(defn mulk [] fn))  
(def mulk (clojure/fn ([] fn)))  
user> (let [fn 100]  
        (defn mulk [] fn))  
#'user/mulk  
user> (mulk)  
100 

Wenn fn doch augenscheinlich dasselbe bezeichnet wie clojure/fn, wie kann es dann sein, daß lokales Binden desselben nicht dazu führt, daß das Makro in etwas expandiert, das versucht, die Zahl 100 aufzurufen (was freilich ein Fehler wäre)?

Vielleicht liegt es hieran:

user> (identical? 'fn 'fn)  
false  
user> `fn  
clojure/fn  
user> 'fn  
fn 

Der Leser von Clojure interniert Symbole nicht, und backquote und quote verhalten sich unterschiedlich, je nach dem, welche Variablen gerade in den aktuellen Namensraum importiert sind. (Ich sage hier bewußt „Variablen“ und nicht „Symbole“, denn wenn das Namensraumsystem Symbolen einen Namensraum gäbe und nicht den Bindungen, die an diesen Symbolen hängen, würde das Ergebnis höchstwahrscheinlich anders aussehen, weshalb ich vermute, daß das nicht der Fall ist. Andererseits sage ich auch nicht „Bindungen“, weil ich mir nicht sicher bin, ob wirklich Bindungen importiert werden oder doch irgendwas anderes. „Variablen“ ist hingegen ein hinreichend schwammiger Ausdruck, um so zu tun, als wüßte ich, wovon ich spreche.)

Ich weiß noch nicht, wie Clojures Namensraumsystem funktioniert, aber es scheint beim Vermeiden von Unhygiene und Referenzintransparenz irgend eine Rolle zu spielen. Nur eines kann ich sagen: Das Gesamtsystem scheint seine Arbeit gut zu machen.