Clojure: эквивалент функции Common Lisp READ? - PullRequest
11 голосов
/ 18 мая 2010

Когда я хочу прочитать 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. Есть идеи?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 18 мая 2010

Вы можете сделать, например,

(require '[clojure.contrib.io :as io])

(io/with-in-reader (io/file "foo.txt") (read))
; => (1 2 3)

Обратите внимание, что вы, вероятно, захотите сначала привязать *read-eval* к false. Также обратите внимание, что вышеперечисленное работает с текущей HEAD contrib (и почти наверняка будет работать в 1.2, когда она выйдет) для Clojure 1.1 такая же функциональность доступна в пространствах имен clojure.contrib.duck-streams и clojure.contrib.java-utils.

6 голосов
/ 18 мая 2010

Я нашел решение здесь: Как вы оцениваете строку как выражение clojure?

(read-string (slurp "foo.txt"))

Извините, что беспокою вас, ребята ^ _ ^

...