如何使用Clojure的doc函数?

42

我刚开始学习Clojure,但无法访问doc函数。

我正在使用Emacs24和Swank-Clojure,版本为Clojure 1.3。

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]
我阅读了为什么REPL将clojure.core/doc视为变量?并按建议操作:
(clojure.repl/doc doc)

但是,我收到了:

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

看起来我没有“导入”常规的命名空间,但真的不知道该怎么做。

谢谢。

更新

在从Java(java -jar ...)使用Clojure时,它能够正常工作,因此这是Emacs设置的问题。


(doc doc)在我使用java -jar clojure-1.3.0.jar运行Clojure时正常工作。你试过以这种方式使用它吗? - Jan
是的,直接从Java使用Clojure效果很好,所以看起来这是我的Emacs设置出了问题。谢谢回答。 - zaforas
1
如果你正在使用Emacs中的SLIME,因为SLIME本身已经提供了相应的功能,所以clojure.repl的内容不会加载到你的REPL中。例如,你可以通过C-c C-d d来获取文档。 - Paul Legato
3个回答

71
你需要以某种方式获取 clojure.repl 命名空间:
从 REPL 中获取。
user> (use 'clojure.repl)
user> (doc doc)

或者在你的程序中

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

很好的答案,对我有用!OP和评论让我想到这可能是一个版本问题 - 这是事实吗? - Matt Fenwick
1
clojure.repl 命名空间不是自动在 repl 会话中使用吗?我有什么遗漏的吗? - Goran Jovic
3
Goran,这取决于REPL的启动方式。 - Sean Corfield

16

将以下内容添加到您的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或更早版本的项目,文档和源代码始终可用,不需要导入)。
此内容感谢Matthew Boston。请注意Phil Hagelberg的回复,指出大多数REPL特定功能可以直接在Emacs / Slime中访问,而无需在REPL中直接使用这些函数。

1
Phil的回答中有一个错字: 正确的SLIME文档命令是[C-c C-d d] (http://common-lisp.net/project/slime/doc/html/Documentation.html#Documentation)。 (另外,可能会让某人感到沮丧的是,user.clj在最近的Leiningen版本中已被弃用。) - Paul Legato
使用 *clojure-version* {:major 1, :minor 5, :incremental 1, :qualifier nil} 运行 cider,只需按下 C-c C-d 即可开始输入函数名称以获取帮助。实际上,在这个 教程 的底部已经描述了这一点,但是在之前还有一种旧的、不再起作用的获取文档的方式。 - nymo

4

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


从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开始,默认情况下可以在repl上使用doc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接