开发者

Can't get pprint to work in clojure

Noob question, using Win7 64-bit, Clojure 1.2.0, Java 1.6.0_22

When I start clojure from command line, pprint function is easily available.

user=> pprint
#<pprint$pprint clojure.pprint$pprint@16dfa45>
user=> (pprint "hi")
"hi"
nil
user=>

But when I try to use pprint from a file, I get an error. This happens with and without namespace (ns... :require...) as shown in pprint documentation

clj file as follows:

(ns whatevah
(:require clojure.pprint))

(pprint "hi")

Error as follows:

C:\Users\mischw\code\Clojure>java -cp ";c:\users\mischw\code\clojure\classes\*;c:\Program Files (x86)\Java\SWT;c:\users\mischw\code\clojure\classes\bookcode\*" clojure.main swinglearn.clj 
Exception in thread "main" java.lang.Exception: Unable to resolve symbol: pprint in this context (swinglearn.clj:14)
... 21 more

Output completed (0 sec consumed) - Normal Termination

I don't understand the general idea of what's going on here. Why does one work but not the other? Does that have to do with namespaces? Classpaths? Some other simple fix? Clearly noob questions, but I find this happens with a bunch of examples... I'm unable to run them ev开发者_运维技巧en though it seems straightforward to import/use/require/include them.


You're getting require mixed up with use and/or import. require causes the library to get loaded, and every public symbol it exports will be accessible as eg clojure.pprint/pprint. If you want to use a more convenient name like just pprint, you need to refer to the namespace. use is a convenient shorthand for "require, then refer", to load the library without the namespace prefix.

user> (ns user (:require clojure.pprint))
nil
user> (pprint 1)
; Evaluation aborted.
user> (clojure.pprint/pprint 1)
1
nil
user> (ns user (:use clojure.pprint))
nil
user> (pprint 1)
1

Edit: Not sure why it's working for you from the REPL. As you can see, it doesn't work for me. I imagine you did some setup earlier that makes it work and then forgot about it, or possibly you have some init script that does this stuff for you at the REPL but not when loading from a file.


Here are a couple of examples:

;;how to use it with :require and :use

;; :require 
(ns example.pprinter
    (:require [clojure.pprint :as pp]))

(def myname "John Smith")
(pp/pprint myname)

;; :use
(ns example.pprinter
    (:use clojure.pprint))

(def myname "John Smith")
(pprint myname)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜