无法让pprint在clojure中工作

Son*_*oth 17 namespaces clojure classpath pprint

Noob问题,使用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=>
Run Code Online (Sandbox Code Playgroud)

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

clj文件如下:

(ns whatevah
(:require clojure.pprint))

(pprint "hi")
Run Code Online (Sandbox Code Playgroud)

错误如下:

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
Run Code Online (Sandbox Code Playgroud)

我不明白这里发生了什么的一般想法.为什么一个工作而另一个工作?这与名称空间有关吗?类路径?其他一些简单的修复?显然noob问题,但我发现这发生在一堆例子中......即使导入/使用/ require/include它们似乎很简单,我也无法运行它们.

ama*_*loy 26

你和... require混淆了. 导致库被加载,并且它导出的每个公共符号都可以访问,例如.如果您想使用更方便的名称,则需要使用命名空间.是"require,then refer"的便捷简写,用于加载没有命名空间前缀的库.useimportrequireclojure.pprint/pprintpprintreferuse

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
Run Code Online (Sandbox Code Playgroud)

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

  • repl不会自动执行此操作.你有一些疯狂的repl-launch脚本为你做的; 如果你详细了解如何启动你的repl,你可能会得到答案. (3认同)