Clojure:相当于Common Lisp READ函数?

jkn*_*rkn 11 lisp file 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)))
Run Code Online (Sandbox Code Playgroud)

例如,如果我有一个名为foo.txt包含S表达式的文件(1 2 3),则上述函数将返回该表达式,如果调用如下:(load-file "foo.txt").

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

谢谢!

Mic*_*zyk 8

你可以这样做

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

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

请注意,您很可能需要重新绑定*read-eval*false第一位.另请注意,上面的内容适用于当前的contrib HEAD(当它发布时几乎肯定会在1.2中工作); 对于Clojure 1.1,clojure.contrib.duck-streamsclojure.contrib.java-utils名称空间中提供了相同的功能.

  • `slurp` /`io/slurp*`啜饮文件的全部内容,即使`read-string`只读取整个表格并丢弃其余的表格."with-in-reader"方法只能读取第一种形式(由于缓冲).此外,您可以在"with-in-reader"的主体中拥有更多表单; 特别是,随后在同一个`with-in-reader`表单中调用`read`将从文件中返回更多表单.(尝试使用`[(read)(read)]`作为正文来获取最初的两个表格.)尽管如此,我已经将你的答案与我想到的一起发布了.:-) (2认同)

jkn*_*rkn 6

我在这里找到了一个解决方案:如何将字符串作为clojure表达式进行求值?

(read-string (slurp "foo.txt"))
Run Code Online (Sandbox Code Playgroud)

抱歉打扰你,伙计^ _ ^