当我想将存储在文件中的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中找到同样优雅的解决方案。有什么想法吗?
谢谢!
答案 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-streams
和clojure.contrib.java-utils
命名空间中提供了相同的功能。
答案 1 :(得分:6)
我在这里找到了一个解决方案:How do you evaluate a string as a clojure expression?
(read-string (slurp "foo.txt"))
很抱歉打扰你,伙计^ _ ^