Я пытаюсь получить документацию с помощью функции Clojure doc
, но не могу распознать ее в REPL (я использую Emacs и SLIME). Следующая последовательность описывает, что происходит (сообщение об ошибке следует сразу после каждой строки):
gaidica.core> (doc first)
; Evaluation aborted.
Unable to resolve symbol: doc in this context
[Thrown class java.lang.Exception]
gaidica.core> (clojure.core/doc first)
; Evaluation aborted.
No such var: clojure.core/doc
[Thrown class java.lang.Exception]
user> (clojure.core/doc first)
; Evaluation aborted.
No such var: clojure.core/doc
[Thrown class java.lang.Exception]
user> (doc first)
-------------------------
clojure.core/first
([coll])
Returns the first item in the collection. Calls seq on its
argument. If coll is nil, returns nil.
nil
user>
Как обратиться к функции doc
и распознать ее как функцию, а не как переменную?
ДОБАВЛЕНИЕ, 22.06.11, через 9 часов после публикации вопроса
@kotarak сделал наиболее подходящий комментарий: «Обратите внимание, что clojure.core/doc — это 1.2 и более ранние версии. clojure.repl/doc — это 1.3 и более поздние версии». Конечно же, сработало следующее:
user> (clojure.repl/doc first)
-------------------------
clojure.core/first
([coll])
Returns the first item in the collection. Calls seq on its
argument. If coll is nil, returns nil.
nil
user>
Я смог подтвердить, что Clojure 1.3 был активен:
user> *clojure-version*
{:interim true, :major 1, :minor 3, :incremental 0, :qualifier "master"}
user>
Но это тоже сбивало с толку — в моем проекте Leiningen project.clj был указан Clojure 1.2!
По своему собственному опыту я однажды заметил, что REPL на основе SLIME «зависает» от значения пути к классам Java даже после того, как я изменил содержимое соответствующих каталогов. Тогда решение состояло в том, чтобы выйти из Emacs и lein swank
, затем снова войти в оба и повторить попытку. Я попробовал то же самое и получил следующий результат:
user> *clojure-version*
{:major 1, :minor 2, :incremental 0, :qualifier ""}
user>
Единственный вывод, который я могу сделать, это то, что мой предыдущий REPL использовал Clojure 1.3. В проекте, над которым я работал до этого, использовался моментальный снимок Clojure 1.3, поэтому я предполагаю, что REPL каким-то образом «повис» на Clojure 1.3.
Проблема решена, урок усвоен и т. д. В качестве бонусных баллов кто-нибудь может объяснить причину того, что произошло (с Clojure 1.2 по сравнению с 1.3)?
Спасибо всем, кто внес свой вклад.