まず第一に、あなたの関数は、多くの入力のためだけで正常に動作:
Clojure 1.3.0
user=> (defn writelines [file-path lines]
(with-open [wtr (clojure.java.io/writer file-path)]
(doseq [line lines] (.write wtr line))))
#'user/writelines
user=> (writelines "foobar" ["a" "b"])
nil
user=> (writelines "quux" [1 2])
nil
しかし、あなたは奇妙な何かを渡すしようとしたとき、我々はあなたが記述エラーを取得:このエラー
user=> (writelines "quux" [#{1}])
IllegalArgumentException No matching method found: write for class java.io.BufferedWriter clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79)
をBufferedWriter
には複数のオーバーロードされたバージョンwrite
があり、clojureはどちらを呼び出すべきかわからないからです。この場合、矛盾するものはwrite(char[])
とwrite(String)
です。文字列("a"
)や整数(1
)のような入力では、clojureはメソッドのString
のバージョンを呼び出すことは知っていましたが、他のもの(例えばクロージャーセット#{1}
)を使用してクロージャーを判断できませんでした。
writelines
への入力がString
になることを保証するか、str
関数を使用して文字列化することはどうですか?
また、spit
functionをご覧ください。
明快さのために、あなたの質問に関数呼び出しを追加できますか? opqdonutの答えを確認する可能性があります。 – Gert
あなたの質問には答えられませんが、この文脈では興味深いかもしれません:http://stackoverflow.com/questions/7756909/in-clojure-1-3-how-to-read-and-write-a-file/ 7757674#7757674 –