关于emacs:如何使用clojure doc函数?

How to use clojure doc function?

我只是从Clojure开始,无法访问doc函数。

我正在将clojure 1.3与emacs24和swank-clojure一起使用。

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

但是当我尝试:

1
(doc doc)

我得到:

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

我已经阅读了为什么REPL会将clojure.core / doc视为var? 并建议:

1
(clojure.repl/doc doc)

但是然后,我收到:

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

看来我不是在"导入"常用的名称空间,但实际上不知道该怎么做。

谢谢。

更新

使用java中的clojure(java -jar ...)效果很好,因此emacs设置存在问题。


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

来自REPL

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

或在您的程序中

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


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

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

对于使用Clojure 1.3.0和更高版本的项目,这将导致Leiningen在启动时自动导入这两个名称空间(但对于使用Clojure 1.2.1或更早版本的项目,则不会导入该名称空间-在此文档和源始终可用)。

这要归功于Matthew Boston。还请注意,Phil Hagelberg的答复指出大多数REPL特定功能可以在Emacs / Slime中直接访问,而无需直接在REPL中使用。


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

1
2
3
4
5
6
7
;; ~/.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默认可用。