Странность Clojure с Var.intern и RT.var

Таким образом, я пытаюсь исследовать внутренности 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)

Это могло быть ошибкой?

5
задан Jieren 13 January 2010 в 20:33
поделиться

2 ответа

Это работает нормально:

(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"))
4
ответ дан 15 December 2019 в 01:02
поделиться

REPL - это просто clojure.main, так что мы не можем интернировать clojure.main/require в REPL, но clojure.core/require, я думаю!

0
ответ дан 15 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: