2011-12-26 5 views
1

から呼び出されたときに出力をファイルに書いていないので、私はREPLから呼び出されたときにうまく機能し、以下の機能を持っている:Clojureの機能は-main

しかし
(defn plot-data-files 
    "Produces a file with x-axis values on 1st column and y-axis values on the 
    2nd column" 
    [] 
    (let [filename (user-input "file to which you want to write plot output") 
     x-values file-data-days 
     y-values (get-dndtf) 
     file-writer (new java.io.FileWriter filename)] 
    (if (= (first y-values) za-not-found) 
     (println za-not-found) 
     (for [index (range (count x-values))] 
     (binding [*out* file-writer] 
      (prn (Double/parseDouble (str (nth x-values index))) 
       (Double/parseDouble (str (nth y-values index))))))))) 

、私はjarファイルを生成するためにLeinigenを使用しようとすると、この関数はファイルに書き込まれなくなりました。だから私はREPLから-mainを呼び出すことを試みました。そして確かに、この関数はファイル自体に呼び出されたとしても、ファイルに書き込みません。そこで、私は別の関数を定義しようとしました:

(defn call-plot-function 
    "Basically calls the plot function, plot-data-files" 
    [] (plot-data-files)) 

そして確かに、それは動作します。

(defn -main [& args] 
    (get-all-file-data) 
    (while (not (= \n (first (user-input "whether you want to output more plot 
    files")))) 
    (call-plot-function))) 

そして-mainが呼び出されたときに、再び、plot-data-filesは魔法のファイル出力を書き込みません:私は再び-mainを呼び出しますが、この時間は直接call-plot-function代わりのplot-data-filesを呼び出してみてください。私はここで何をすべきですか?

答えて

6

forはループではありません。あなたの-mainはレイジーシーケンスを返すので、あなたは決してその要素を強制しません。あなたはその違いを見る理由です。シーケンスの代わりに副作用が必要な場合は、doseqはそれ以外の場合はforと同じセマンティクスを持ちます。

関連する問題