Clojure:相当于Common Lisp READ函数?

时间:2010-05-18 00:56:24

标签: file lisp clojure

当我想将存储在文件中的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),则上述函数将返回该表达式,如果调用如下:(load-file "foo.txt")

我一直在搜索和搜索,并没有在Clojure中找到同样优雅的解决方案。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:8)

你可以这样做。

(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-streamsclojure.contrib.java-utils命名空间中提供了相同的功能。

答案 1 :(得分:6)

我在这里找到了一个解决方案:How do you evaluate a string as a clojure expression?

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

很抱歉打扰你,伙计^ _ ^