2017-04-17 4 views
2

私はClojureの初心者です。コマンドラインで指定する必要があるファイルを読み込もうとしています。Clojureでは、コマンドプロンプトで指定されたファイルを読む

私はREPLで、ファイル名を与えて、次のことをしようとすると、それは

(ns testpj.core 
    (:require [clojure.java.io :as io])) 

    (defn readfile [filename] 
    (println (System/getProperty "user.dir")) 
    (println "Arguments: " filename) 
    (slurp filename)) 

を取り組んでいます。そして、私はREPLでこれを実行すると、私は、ファイルの内容

(require '[testpj.core :as h]) 
    (h/readfile file1.txt) 

を得る。しかし上記のコードをmainに変更したときに、ファイル名を コマンドラインで指定しようとしました。

lein run file1.txt 



(defn -main [& args] 
(println (System/getProperty "user.dir")) 
(println "Arguments: " args) 
(slurp args)) 

、次のエラーが表示されます。

"java.lang.IllegalArgumentException:<(" file1.txt ")>をInputStreamとして開くことができません。

誰でも手助けできますか?ありがとう

答えて

1

-mainの引数ベクトルは[& args]です。つまり、-mainは任意の数の引数を受け入れます。関数内では、変数argsは、渡された引数のリストにバインドされます。関数に引数が与えられていない場合はnilです。だから、複数の引数を取る関数に渡さslurp最初引数に:

(slurp (first args)) 
+1

あなたは、「VAR 'args'」と言うが、「varが」Clojureの中に特定の意味を持つ単語であることを覚えておいてください関数のローカルは別のものです。バインディング、ローカル、または引数と呼ぶことができます。 – amalloy

関連する問題