18

Win7 64 ビット、Clojure 1.2.0、Java 1.6.0_22 を使用した Noob の質問

コマンドラインから 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

and/or と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

編集:なぜREPLからあなたのために働いているのかわからない. ご覧のとおり、私にはうまくいきません。以前にセットアップを行ってそれを機能させた後、それを忘れていたと思います。または、ファイルからロードするときではなく、REPL でこのようなことを行う init スクリプトを持っている可能性があります。

于 2011-03-11T18:17:54.513 に答える