2016-04-02 6 views
1

私は現在Clojureを習得しようとしていて、 grepのようなよく知られたUnixツールの非常に基本的な動作を実装しています。 cat,lsなど。"lein run"とslaperの動作が異なり、uberjarファイルを実行しています

catを実装しているうちに、一見奇妙な振る舞いにつまずいた slurpを見つけました。 lein run some-file.txtで次のコードを実行すると、some-file.txt が現在のディレクトリ内にある場合、コンテンツは期待どおりにSTDOUTに出力されます。しかし

(ns cat.core 
    (:gen-class)) 

(defn -main 
    "Reads the content of its arguments representing filenames and outputs the 
    content in succession." 
    [& filenames] 
    (doseq [filename filenames] 
    (println "Reading" filename) ; Just for debugging purposes 
    (print (slurp filename)))) 

、私は(そのディレクトリ内のテキストファイルの存在を) java -jar cat-0.1.0-SNAPSHOT-standalone.jar some-file.txtでスタンドアロンJARを実行するために

lein compile 
lein uberjar 

、その後target/uberjarcdでプロジェクトをuberjar場合は、私が、 何もデバッグメッセージが表示されます。私が奇妙なのは、エラーメッセージ が表示されているということです。ファイルが見つかったようです。パラメータとして存在しないファイルで JARを実行すると、指定した ファイルが(期待通りに)見つからないという例外が発生します。

私はWindowsマシンで作業しているため、同僚はおそらくWindows のシャドウファイルが問題である可能性があると示唆していました。だから私はLinuxでプログラムを再度テストし、 同じ動作が発生しました。だから、これは私のClojure理解/私のプロジェクト 設定の "問題"と思われます。

私の質問は:なぜlein runと を実行するときにslurp年代(またはプログラムの)動作が異なっており、java -jar cat-0.1.0-SNAPSHOT-standalone.jarスタンドアロンJARを実行しているとき、私はこの問題を解決するために何ができるのでしょうか?

ファイルパラメータがJARにコンパイルされたリソースではないため、私が間違っていない場合は、(slurp (clojure.java.io/resource filename))には の必要はありません。

答えて

3

print出力バッファをフラッシュしません。私が代わりに `` flush`を使用することを選択したい、

(defn -main 
    "Reads the content of its arguments representing filenames and outputs the 
    content in succession." 
    [& filenames] 
    (doseq [filename filenames] 
    (print (slurp filename)) 
    (flush))) 
+1

完全に模倣 'cat'の動作するために:あなたは、あなたprint文の後flushを使用するか、改行にフラッシュする別のprintlnを、使用する必要がありますprintln'( 'cat'は出力後に改行を挿入しません) – OlegTheCat

+1

合意しました!私は 'println'の代わりに' flush'を表示するように編集しました。ありがとう、@OlegTheCat –

関連する問題