如何使用clojure doc功能?

时间:2011-11-30 20:36:49

标签: emacs clojure doc classnotfoundexception

我刚刚开始使用Clojure,无法访问doc函数。

我正在使用clojure 1.3和emacs24以及swank-clojure。

user> *clojure-version*
{:major 1, :minor 3, :incremental 0, :qualifier nil}

但是当我尝试时:

(doc doc)

我明白了:

Unable to resolve symbol: doc in this context
[Thrown class java.lang.RuntimeException]

我已阅读Why does REPL treat clojure.core/doc as a var?并按照建议阅读:

(clojure.repl/doc doc)

但接着,我收到了:

clojure.repl
[Thrown class java.lang.ClassNotFoundException]

我似乎并没有“导入”通常的命名空间,但实际上并不知道该怎么做。

感谢。

更新

使用java中的clojure(java -jar ...)它运行良好,所以这是emacs设置的问题。

3 个答案:

答案 0 :(得分:53)

您需要以某种方式获取clojure.repl命名空间:

来自REPL

user> (use 'clojure.repl)
user> (doc doc)

或在你的程序中

(ns foobar
  (:use [clojure.repl]))

答案 1 :(得分:14)

将以下内容添加到您的Leiningen user.clj文件中(在Mac / Linux上,它是〜/ .lein / user.clj):

;; ~/.lein/user.clj
(if (>= (.compareTo (clojure-version) "1.3.0") 0)
  (do (use 'clojure.repl)
      (use 'clojure.java.javadoc)))

这将导致Leiningen在启动时为使用Clojure 1.3.0及更高版本的项目自动导入这两个名称空间(但不适用于使用Clojure 1.2.1或更早版本的项目 - 其中doc和source始终可用)。

此信用转到Matthew Boston。另请注意Phil Hagelberg's reply指出大多数特定于REPL的功能可直接在Emacs / Slime中访问,而不需要直接在REPL中使用这些函数。

答案 2 :(得分:4)

从Lein 2开始,名称空间可以在启动时使用:injections自动导入,例如:

;; ~/.lein/profiles.clj
{:user {:plugins [[lein-swank "1.4.4"]
                  [lein-noir "1.2.1"]
                  [lein-pprint "1.1.1"]]
       :injections [(use 'clojure.repl)
                    (use 'clojure.java.javadoc)
                    (use 'clojure.pprint)] }}

但请参阅SLIME等效的其他回复。

我不确定这种情况何时成为现实,但是lein 2.2 doc 默认情况下可以在repl上使用。