Прежде всего, ваша функция прекрасно работает для многих входов:
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
версию метода, но с чем-то другим (например, набор clojure, #{1}
) clojure не мог решить.1015 *
Как насчет того, чтобы убедиться, что входные данные для writelines
действительно String
s, или для их строкового преобразования с использованием функции str
?
Также взгляните на spit
функция .