I want to use the functions in the clojure.contrib.trace namespace in slime at the REPL. How can I get slime to load them automatically? A related question, how can I add a
You're getting "Unable to resolve symbol" exceptions because :require
doesn't pull in any Vars from the given namespace, it only makes the namespace itself available.
Thus if you (:require foo.bar)
in your ns
form, you have to write foo.bar/quux
to access the Var quux
from the namespace foo.bar
. You can also use (:require [foo.bar :as fb])
to be able to shorten that to fb/quux
. A final possiblity is to write (:use foo.bar)
instead; that makes all the Vars from foo.bar
available in your namespace. Note that it is generally considered bad style to :use
external libraries; it's probably ok within a single project, though.
Re: automatically making stuff available at the REPL:
The :require
, :use
and :refer
clauses of ns
forms have counterparts in the require
, use
and refer
functions in clojure.core
. There are also macros corresponding to :refer-clojure
and :import
.
That means that in order to make clojure.contrib.trace
available at the REPL you can do something like (require 'clojure.contrib.trace)
or (require '[clojure.contrib.trace :as trace])
. Note that because require
is a function, you need to quote the library spec. (use
and refer
also take quoted lib specs; import
and refer-clojure
require no quoting.)
The simplest way to have certain namespaces available every time you launch a Clojure REPL (including when you do it with SLIME) is to put the appropriate require
calls in ~/.clojure/user.clj
. See the Requiring all possible namespaces blog post by John Lawrence Aspden for a description of what you might put in user.clj
to pull in all of contrib (something I don't do, personally, though I do have a (use 'clojure.contrib.repl-utils)
in there).