2010-05-18 69 views
11

当我想在存储在一个文件到正在运行的Common Lisp程序中的S-表达仔细一看,请执行下列操作:Clojure:相当于Common Lisp READ功能?

(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中找到同样优雅的解决方案。有任何想法吗?

谢谢!

回答

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名称空间中可以使用相同的功能。

+0

嗨,什么是利用这种方法相对于(读字符串,如果有的话,(啜食“foo.txt”)) – jkndrkn 2010-05-18 01:31:04

+2

'slurp' /'io/slurp *'尽管'read-string'只能读取一个整体形式并丢弃剩下的文件,阅读器中的方法只会读取第一个表格的一小部分(由于缓冲)。另外,你可以在'带有阅读器'的主体中有更多的表单;特别是随后在同一个'with-in-reader'表单中调用'read'将会从文件中返回更多的表单。 (尝试使用'[(read)(read)]'作为身体来获得最初的两种形式。)但是,我已经将这个答案和我想到的一起发布了。 :-) – 2010-05-18 01:42:27