【问题标题】:Can't get pprint to work in clojure无法让 pprint 在 clojure 中工作
【发布时间】:2011-03-11 18:08:51
【问题描述】:

菜鸟问题,使用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

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

【问题讨论】:

    标签: namespaces clojure classpath pprint


    【解决方案1】:

    您将requireuse 和/或import 混为一谈。 require 导致库被加载,并且它导出的每个公共符号都可以访问,例如clojure.pprint/pprint。如果您想使用更方便的名称,例如 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 中为你做这些事情,但在从文件加载时没有。

    【讨论】:

    • 太棒了,谢谢,它成功了:)。我知道这很简单。那么为什么repl会自动useclojure.pprint呢?如何找出 repl 加载了哪些命名空间,以便下次遇到此问题时可以弄清楚?
    • repl 不会自动执行此操作。您有一些疯狂的重新启动脚本可以为您完成;如果您更详细地了解如何启动您的 repl,您可能会得到答案。
    【解决方案2】:

    这里有几个例子:

    ;;如何与 :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)
    

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2018-02-26
      • 2019-07-06
      • 2015-11-27
      • 2012-10-16
      • 2010-11-30
      相关资源
      最近更新 更多