Clojure Notes

REPL

Test:

'((()))

Print last exception:

(.printStackTrace *e)

(do returns last sequence

Add cool stuff:

(use 'clojure.contrib.repl-utils)
(source +)

Show contents of a lib:

(ns-publics 'clojure.contrib.repl-utils)

Using the help (p. 52):

(find-doc #"\?$")

Evil Macro Stuff

Symbols and Vars

At the REPL, q is not defined, but the symbol 'q exists of course

user=> q
java.lang.Exception: Unable to resolve symbol: q in this context (NO_SOURCE_FILE:0)
user=> 'q
q
user=> (type 'q)
clojure.lang.Symbol

Now with q defined:

user=> (def q "hi")
#'user/q

Evaluating q returns its value:

user=> q
"hi"
user=> (type q)
java.lang.String

Quoting q returns its symbol:

user=> (quote q)
q
user=> 'q
q
user=> (type 'q)
clojure.lang.Symbol

Get the var of q:

user=> (var q)
#'user/q
user=> #'q
#'user/q
user=> (type #'q)
clojure.lang.Var
user=> (var-get #'q)
"hi"

I don’t know how to directly get the value of the quoted symbol 'q, but getting it indirectly looks like this:

user=> (def foo 'q)
#'user/foo
user=> foo
q
user=> (var-get (resolve foo))
"hi"

Metadata

With q still defined:

user=> (def q "hi")
#'user/q
user=> (meta q)
nil

Namespaces

Switching is nice and easy

user=> (ns foo)
nil
foo=> (def x "x in foo")
#'foo/x
foo=> x
"x in foo"
foo=> (ns bar)
nil
bar=> x
java.lang.Exception: Unable to resolve symbol: x in this context (NO_SOURCE_FILE:0)
bar=> foo/x
"x in foo"

Aliasing works too:

bar=> ; foo/x is too much to type ;)
bar=> (alias 'f 'foo)
nil
bar=> f/x
"x in foo"