我刚刚开始使用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设置的问题。
答案 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上使用。