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.