Clojure: эквивалентно общей функции Lisp READ?
Когда я хочу прочитать в 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. Любые идеи?
Спасибо!
Ответы
Ответ 1
Вы можете сделать, например,
(require '[clojure.contrib.io :as io])
(io/with-in-reader (io/file "foo.txt") (read))
; => (1 2 3)
Обратите внимание, что вы, скорее всего, захотите повторно привязать *read-eval*
к false
. Также обратите внимание, что вышеупомянутое работает с текущим вкладом HEAD (и почти наверняка будет работать в 1.2, когда он будет выпущен); для Clojure 1.1, те же функциональные возможности доступны в пространствах имен clojure.contrib.duck-streams
и clojure.contrib.java-utils
.
Ответ 2
Я нашел решение здесь: Как вы оцениваете строку как выражение clojure?
(read-string (slurp "foo.txt"))
Извините, что беспокою вас, люди ^ _ ^