4

Я столкнулся с этой проблемой после создания нового пространства имен.Почему Clojure не предоставляет стандартную библиотеку после создания нового пространства имен?

Вот код:

(create-ns 'my-new-ns) 
=> #object[clojure.lang.Namespace 0x7c7c8359 "my-new-ns"] 

(in-ns 'my-new-ns) 
=> #object[clojure.lang.Namespace 0x7c7c8359 "my-new-ns"] 

(reduce + [1 2 3]) 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: reduce in this context, compiling:(/private/var/folders/pg/bynypsm12nx1s4gzm56mwtcr0000gn/T/form-init1425759900088902804.clj:1:1) 

Как вы можете видеть reduce функция не определена в my-new-ns имен.

Я должен был бы создавать новые пространства имен так Что было бы лучшим решением для этой проблемы?

P.S: Кроме того, я пытаюсь создать эти пространства имен для своих пользователей, чтобы они могли делать все, что захотят, в своих пространствах имен (идея похожа на контейнер) и создавать изоляцию между пространствами имен.

ответ

6

Функции clojure.core не являются особыми в их необходимости упоминаться, чтобы сделать их доступными для неквалифицированного использования. ns макрос делает несколько вещей:

  • создает пространство имен - create-ns
  • изменяет текущее пространство имен для этого пространства имен - in-ns
  • автоматически относится все Clojure.Ядро вары в новое пространство имен - refer-clojure

Вы всегда можете использовать квалифицированного вида функции ядра (неквалифицированный просто меньше набирать), так что, когда вы в этой ситуации, это просто звонок поможет вам прямо еще раз:

(clojure.core/refer-clojure) 
1

Ваше новое пространство имен должно использовать «стандартные» пространства имен, чтобы иметь возможность разрешать имена в них. Документация указывает, что это будет java.lang, clojure.lang.Compiler и clojure.core.

5

Вместо того, чтобы создавать пространство имен вручную и затем переключаться на него, я бы рекомендовал использовать макрос ns. Согласно документу:

Устанавливает * ns * в пространство имен по имени (без оценки), создавая его, если необходимо.

Также он load all public vars из clojure.core вновь созданных имен.

Таким образом, в основном это

> (create-ns 'my-new-ns) 
> (in-ns 'my-new-ns) 
> (clojure.core/refer 'clojure.core) 

равен этого

> (ns my-new-ns) 

Update:

Отвечая на ваш вопрос: символы из стандартной библиотеки не refer красные вновь созданное пространства имен, это почему вы не можете получить к ним доступ без классификатора:

> (create-ns 'x) 
> (in-ns 'x) 
> reduce ;; throws "Unable to resolve symbol" 
> clojure.core/reduce ;; works fine 

Эти символы нужно направить по телефону (clojure.core/refer 'clojure.core).

1

Я думаю, вы должны использовать

(ns my-new-ns) 

вместо этого. create-ns - объект низкого уровня.

Смежные вопросы