【问题标题】:How to use clojure doc function?如何使用 clojure 文档功能?
【发布时间】:2012-01-10 01:58:44
【问题描述】:

我刚开始使用 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]

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

(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 上运行良好。你试过这样用吗?
  • 是的,直接从 java 中使用 clojure 效果很好,所以我的 emacs 设置似乎有问题。感谢您的回答。
  • 如果你使用 Emacs 的 SLIME,clojure.repl 内容不会加载到你的 REPL 中,因为 SLIME 本身已经提供了等价物 - 例如,你可以使用 C-c C-d d 获取文档

标签: emacs clojure doc classnotfoundexception


【解决方案1】:

从 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 中可用。

【讨论】:

    【解决方案2】:

    将以下内容添加到您的 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's reply,它指出大多数 REPL 特定的功能可以直接在 Emacs / Slime 中访问,而无需直接在 REPL 中使用这些功能。

    【讨论】:

    • Phil 的回复中有错字:正确的 SLIME docs 命令是 C-c C-d d。 (此外,知道 user.clj 在最新版本的 Leiningen 中已被弃用,这可能会让某些人感到沮丧。)
    • 运行cider*clojure-version* {:major 1, :minor 5, :incremental 1, :qualifier nil} 并且只需要C-c C-d 即可开始输入函数名称以获得帮助。实际上,这在tutorial 的底部进行了描述,但以旧的、不再有效的获取文档的方式开头。
    【解决方案3】:

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

    来自 REPL

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

    或在你的程序中

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

    【讨论】:

    • 不错的答案,对我有用! OP 和评论让我认为这是版本问题——是这样吗?
    • clojure.repl 命名空间不是自动用于 repl 会话吗?我错过了什么吗?
    • Goran,这取决于 REPL 是如何启动的。
    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 2017-08-17
    • 2021-02-13
    • 1970-01-01
    • 2019-12-03
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多