Я хочу использовать функции в clojure.contrib.trace пространстве имен в слизи в REPL. Как я могу заставить слизь загружать их автоматически? Связанный вопрос, как я могу добавить определенное пространство имен в выполнение repl?
На clojure.contrib API это описывает использование как это:
(ns my-namespace
(:require clojure.contrib.trace))
Но добавление этого к моему коду приводит к неспособности файла загрузиться с "Не могущий разрешить символ" ошибка для любой функции от пространства имен трассировки.
Я использую leiningen 'lein чванство' для запуска ServerSocket, и project.clj файл похож на это
(defproject test-project "0.1.0"
:description "Connect 4 Agent written in Clojure"
:dependencies [[org.clojure/clojure "1.2.0-master-SNAPSHOT"]
[org.clojure/clojure-contrib "1.2.0-SNAPSHOT"]]
:dev-dependencies [[leiningen/lein-swank "1.2.0-SNAPSHOT"]
[swank-clojure "1.2.0"]])
Все кажется актуальным, т.е. 'lein deps' не вызывает изменений. Так что происходит?
Вы получаете исключения «Невозможно разрешить символ», потому что : require
не извлекает никаких переменных из заданного пространства имен, а только делает доступным само пространство имен.
Таким образом, если вы (: require foo.bar)
в своей форме ns
, вы должны написать foo.bar/quux
, чтобы получить доступ к Var quux
из пространства имен foo.bar
. Вы также можете использовать (: require [foo.bar: as fb])
, чтобы иметь возможность сократить его до fb / quux
. Последняя возможность - написать вместо него (: используйте foo.bar)
; это делает все переменные из foo.bar
доступными в вашем пространстве имен. Обратите внимание, что обычно считается плохим стилем : использовать
внешние библиотеки; хотя, вероятно, это нормально в рамках одного проекта.
Re: автоматическое предоставление материалов в REPL:
: require
, : use
и : refer
пункты ns
формы имеют аналоги в функциях require
, use
и refer
в clojure.core
. Также существуют макросы, соответствующие : refer-clojure
и : import
.
Это означает, что для того, чтобы сделать clojure.contrib.trace
доступным в REPL, вы можете сделать что-то вроде (требуется 'clojure.contrib.trace)
или ( require '[clojure.contrib.trace: as trace])
. Обратите внимание, что поскольку require
- это функция, вам нужно указать спецификацию библиотеки.( use
и refer
также принимают спецификации библиотеки в кавычках; import
и refer-clojure
не требуют цитирования.)
Самый простой способ чтобы определенные пространства имен были доступны каждый раз, когда вы запускаете Clojure REPL (в том числе когда вы делаете это с помощью SLIME), нужно поместить соответствующие вызовы require
в ~ / .clojure / user.clj
. См. Сообщение в блоге Джона Лоуренса Аспдена Требование всех возможных пространств имен , где описано, что вы можете поместить в user.clj
, чтобы получить все contrib (что-то Лично я этого не делаю, хотя у меня есть (используйте там 'clojure.contrib.repl-utils)
).