2010-05-18 100 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