11
votes

When I want to read in an S-expression stored in a file into a running Common Lisp program, I do the following:

(defun load-file (filename)
  "Loads data corresponding to a s-expression in file with name FILENAME."
  (with-open-file (stream filename)
    (read stream)))

If, for example, I have a file named foo.txt that contains the S-expression (1 2 3), the above function will return that S-expression if called as follows: (load-file "foo.txt").

I've been searching and searching and have not found an equally elegant solution in Clojure. Any ideas?

Thanks!

2

2 Answers

8
votes

You can do e.g.

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

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

Note that you'll likely want to rebind *read-eval* to false first. Also note that the above works with current contrib HEAD (and will almost certainly work in 1.2 when it's released); for Clojure 1.1, the same functionality is available in the clojure.contrib.duck-streams and clojure.contrib.java-utils namespaces.

6
votes

I found a solution here: How do you evaluate a string as a clojure expression?

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

Sorry to bother you, folks ^_^