2010-06-07 10 views
9

Devo diffidare dalla creazione di parole chiave clojure con spazi dei nomi inesistenti?C'è qualche problema con le parole chiave clojure di namespace in uno spazio dei nomi inesistente?

Un esempio potrebbe essere: foo/bar, in cui il namespace foo in realtà non esiste. Questo sembra possibile perché queste parole chiave si comportano come valori letterali. Non ho trovato alcun problema nel fare questo in REPL, ma sono preoccupato per possibili problemi con la compilazione AOT.

+1

Ho fatto questo per alcune cose in passato e non ho avuto problemi. –

risposta

7

Un namespace sarà infatti non essere creato semplicemente perché una parola chiave o un simbolo si incontra che "appartengono" ad esso, come la seguente interazione a una nuova REPL illustra:

; SLIME 2010-05-06 
user> (-> (.getNamespace :user/foo) symbol) 
user 
user> (-> (.getNamespace :user/foo) symbol the-ns) 
#<Namespace user> 
user> (-> (.getNamespace :bar/foo) symbol the-ns) 
; java.lang.Exception: No namespace: bar found 

Tuttavia, questo non è motivo di preoccupazione Il campo "namespace" di una parola chiave o di un simbolo è solo una stringa internata; non vi è alcun riferimento all'oggetto namespace corrispondente coinvolto, anche se ne esiste uno. Infatti, come si può vedere sopra, il metodo .getNamespace di parole chiave e simboli restituisce una stringa e si deve saltare qualche luppolo per raggiungere lo spazio dei nomi effettivo da quello.

Cercare di risolvere un simbolo qualificato per lo spazio dei nomi con la funzione resolve è sicuro. Questo indipendentemente dal fatto che lo spazio dei nomi esista effettivamente; in caso contrario, viene restituito nil, come nel caso in cui esiste, ma non contiene Var del nome specificato. ns-resolve, al contrario, genererà un'eccezione come quella menzionata nello snippet dal REPL precedente se non riesce a trovare lo spazio dei nomi specificato.

Problemi correlati