2012. január 21., szombat

Clojure REPL special variables

There are some special variables available only in the REPL, to ease interaction with previous evaluations:

  • *1 and *2 refer to the last and before-last evaluation result of the REPL.
  • *e refers to the last exception thrown (you can use clojure.stacktrace functions to inspect this)
Examples:

user> 123
123
user> (pprint *1)
123
nil
user> (pprint *1)
nil
nil
user> (throw (java.lang.Exception. "My exception"))
; Evaluation aborted.
user> (clojure.stacktrace/print-stack-trace *e)
 java.lang.RuntimeException:
 java.lang.Exception:
My exception at
clojure.lang.Util.runtimeException (Util.java:165)
clojure.lang.Compiler.eval (Compiler.java:6476)
clojure.lang.Compiler.eval (Compiler.java:6431)

2012. január 20., péntek

Clojure REPL: use pretty print


When displaying a hierarchical data structure consisting of lists, sets and maps, use the clojure.pprint package. You can dynamically rebind options to change the default number base, desired column width, etc. Here are some examples:


 user> (def posts [{:id 1000 :summary "This is the first post" :tags #{"java" "clojure" "pprint"}}
       {:id 1001 :summary "
Very very very very very very very very very very long summary" :tags #{"java" "clojure" "pprint"}}])
#'user/posts


 user> (use 'clojure.pprint)
nil


 user> (pprint posts)
[{:summary "This is the first post",
  :id 1000,
  :tags #{"java" "clojure" "pprint"}}
 {:summary "
Very very very very very very very very very very long summary",
  :id 1001,
  :tags #{"java" "clojure" "pprint"}}]
nil


 user> (binding [*print-base* 2]
    (pprint posts))
[{:summary "This is the first post",
  :id 1111101000,
  :tags #{"java" "clojure" "pprint"}}
 {:summary
  "Very very very very very very very very very very long summary",
  :id 1111101001,
  :tags #{"java" "clojure" "pprint"}}]
nil


 user> (binding [*print-right-margin* 30]
    (pprint posts))
[{:summary
  "This is the first post",
  :id 1000,
  :tags
  #{"java"
    "clojure"
    "pprint"}}
 {:summary
  "Very very very very very very very very very very long summary",
  :id 1001,
  :tags
  #{"java"
    "clojure" "pprint"}}]
nil