Таким образом, я пытаюсь исследовать внутренности Clojure, и я столкнулся с чем-то, что я не совсем уверен, что понимаю:
От REPL я могу получить доступ к RT.var ("clojure.core", "потребовать"), очень хорошо (это, как предполагается, возвращает var, связанный с "потребовать" символом в "clojure.core" пространстве имен):
user=> (clojure.lang.RT/var "clojure.core" "require")
#'clojure.core/require
Однако, если я пытаюсь получить доступ к нему в том, что я думал, был тот же путь (
user=> (clojure.lang.Var/intern (clojure.lang.Namespace/findOrCreate (clojure.lang.Symbol/intern nil "clojure.main")) (clojure.lang.Symbol/intern nil "require"))
java.lang.IllegalStateException: require already refers to: #'clojure.core/require in namespace: clojure.main (NO_SOURCE_FILE:0)
Я получаю ошибку, которые требуют, уже относится к чему-то, что существует. Это очень странно, потому что RT.var совпадает с Var.intern, кроме с аргументами, преобразованными в Пространство имен и Символ соответственно.
static public Var var(String ns, String name){
return Var.intern(Namespace.findOrCreate(Symbol.intern(null, ns)), Symbol.intern(null, name));
}
Я сделаю еще некоторое рытье, но я довольно озадачен на этом. Я уже проверил: 1. ноль совпадает с пустыми 2. Я создал var2, который возвращает аргумент пространства имен, отправленный в Var.intern и var3, который возвращает аргумент имени, отправленный в Var.intern. Я затем передаю те два Var.intern:
user=> (clojure.lang.Var/intern
(clojure.lang.RT/var2 "clojure.main" "require")
(clojure.lang.RT/var3 "clojure.main" "require"))
java.lang.IllegalStateException: require already refers to: #'clojure.core/require in namespace: clojure.main (NO_SOURCE_FILE:0)
Это могло быть ошибкой?
Это работает нормально:
(clojure.lang.Var/intern
(clojure.lang.Namespace/findOrCreate
(clojure.lang.Symbol/create "clojure.core"))
(clojure.lang.Symbol/create "require"))
Символ / Стажер
работает также:
(clojure.lang.Var/intern
(clojure.lang.Namespace/findOrCreate
(clojure.lang.Symbol/intern nil "clojure.core"))
(clojure.lang.Symbol/intern nil "require"))
REPL - это просто clojure.main, так что мы не можем интернировать clojure.main/require в REPL, но clojure.core/require, я думаю!