18

菜鸟问题,使用Win7 64位,Clojure 1.2.0,Java 1.6.0_22

当我从命令行启动 clojure 时,pprint 功能很容易使用。

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

但是当我尝试从文件中使用 pprint 时,我得到一个错误。如 pprint 文档中所示,无论有无命名空间(ns...:require...)都会发生这种情况

clj 文件如下:

(ns whatevah
(:require clojure.pprint))

(pprint "hi")

错误如下:

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

我不明白这里发生什么。为什么一个有效而另一个无效?这与命名空间有关吗?类路径?其他一些简单的修复?显然是菜鸟问题,但我发现这发生在一堆例子中......即使导入/使用/需要/包含它们似乎很简单,我也无法运行它们。

4

2 回答 2

27

您正在requireuse和/或混淆importrequire 导致库被加载,并且它导出的每个公共符号都可以作为例如clojure.pprint/pprint. 如果您想使用更方便的名称,例如 just pprint,则需要refer命名空间。use是“需要,然后引用”的便捷简写,用于加载没有命名空间前缀的库。

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

编辑:不确定为什么它对 REPL 有用。如您所见,它对我不起作用。我想你之前做了一些设置让它工作然后忘记了它,或者你可能有一些 init 脚本在 REPL 上为你做这些事情,但在从文件加载时没有。

于 2011-03-11T18:17:54.513 回答
0

这里有几个例子:

;;如何将它与 :require 和 :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)
于 2017-11-17T10:37:15.633 回答