Когда я хочу читать в S-выражении, сохраненном в файле в под управлением программу языка Common LISP, я делаю следующее:
(defun load-file (filename)
"Loads data corresponding to a s-expression in file with name FILENAME."
(with-open-file (stream filename)
(read stream)))
Если, например, мне назвали файл foo.txt
это содержит S-выражение (1 2 3)
, вышеупомянутая функция возвратит то S-выражение, если названо следующим образом: (load-file "foo.txt")
.
Я искал и искал и не нашел одинаково изящное решение в Clojure. Какие-либо идеи?
Спасибо!
Вы можете, например,
(require '[clojure.contrib.io :as io])
(io/with-in-reader (io/file "foo.txt") (read))
; => (1 2 3)
Обратите внимание, что вы, вероятно, сначала захотите повторно привязать * read-eval *
к false
. Также обратите внимание, что приведенное выше работает с текущим contrib HEAD (и почти наверняка будет работать в 1.2, когда он будет выпущен); для Clojure 1.1 такая же функциональность доступна в пространствах имен clojure.contrib.duck-streams
и clojure.contrib.java-utils
.
Я нашел решение здесь: Как вы оцениваете строку как выражение clojure?
(read-string (slurp "foo.txt"))
Извините за беспокойство, ребята ^ _ ^