How to use clojure doc function?
Solution 1
You need to grab the clojure.repl namespace one way or another:
From the REPL
user> (use 'clojure.repl)
user> (doc doc)
or in your program
(ns foobar
(:use [clojure.repl]))
Solution 2
Add the following to your Leiningen user.clj file (on Mac / Linux, it's ~/.lein/user.clj):
;; ~/.lein/user.clj
(if (>= (.compareTo (clojure-version) "1.3.0") 0)
(do (use 'clojure.repl)
(use 'clojure.java.javadoc)))
This will cause Leiningen to automatically import those two namespaces at startup for projects using Clojure 1.3.0 and later (but not for projects using Clojure 1.2.1 or earlier - where doc and source were always available).
Credit goes to Matthew Boston for this. Note also Phil Hagelberg's reply which points out most of the REPL-specific functionality is accessible directly in Emacs / Slime without needing the functions directly in the REPL.
Solution 3
As of Lein 2, namespaces can be automatically imported at startup using :injections
, e.g:
;; ~/.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)] }}
But see other responses for SLIME equivalents.
I'm unsure of when this became the case, but as of lein 2.2 doc is available at the repl by default.
zaforas
Updated on June 03, 2022Comments
-
zaforas almost 2 years
I'm just starting with Clojure and can't access to the doc function.
I'm using clojure 1.3 with emacs24 and swank-clojure.
user> *clojure-version* {:major 1, :minor 3, :incremental 0, :qualifier nil}
But when I try:
(doc doc)
I get:
Unable to resolve symbol: doc in this context [Thrown class java.lang.RuntimeException]
I've read Why does REPL treat clojure.core/doc as a var? and as suggested:
(clojure.repl/doc doc)
But then, I receive:
clojure.repl [Thrown class java.lang.ClassNotFoundException]
It seems I am not "importing" the usual namespaces, but really doesn't know how to do it.
Thanks.
UPDATE
Using clojure from java (java -jar ...) it works well, so it's a problem with the emacs setup.
-
Jan over 12 years
(doc doc)
works fine on my Clojure run asjava -jar clojure-1.3.0.jar
. Did you try to use it this way? -
zaforas over 12 yearsYes, using clojure directly from java works well, so it seems it's a problem with my emacs setup. Thanks for answering.
-
blevlabs over 11 yearsIf you're using SLIME from Emacs, the clojure.repl stuff isn't loaded into your REPL because SLIME itself already provides equivalents - for example, you can get docs with C-c C-d d
-
-
Matt Fenwick over 12 yearsNice answer, works for me! The OP and a comment make me think that it's a version issue -- is this the case?
-
Goran Jovic over 12 yearsIsn't
clojure.repl
namespace automatically used in a repl session? Am I missing something? -
Sean Corfield over 12 yearsGoran, it depends on how the REPL is started.
-
blevlabs over 11 yearsThere is a typo in Phil's reply: the correct SLIME docs command is C-c C-d d. (Also, it may save someone some frustration to know that user.clj has been deprecated in recent versions of Leiningen.)
-
nymo over 10 yearsRunning cider with
*clojure-version*
{:major 1, :minor 5, :incremental 1, :qualifier nil}
and onlyC-c C-d
is needed to start entering the function name to get help on. Actually, this was described at the bottom of this tutorial but was prefaced with the older, no longer working, way of getting the doc.