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.
fonte
2010-06-08 00:41:09
Ho fatto questo per alcune cose in passato e non ho avuto problemi. –