【问题标题】:Clojure: Equivalent to Common Lisp READ function?Clojure:相当于Common Lisp READ函数?
【发布时间】:2010-05-18 00:56:24
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: file lisp clojure


    【解决方案1】:

    你可以这样做,例如

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

    【讨论】:

    • 嗨,如果有的话,这种方法比 (read-string (slurp "foo.txt")) 有什么优势
    • slurp / io/slurp* 将文件的全部内容吞入其中,即使 read-string 只会读取一个完整的表单并丢弃其余表单。 with-in-reader 方法将只读取第一种形式的一点点(由于缓冲)。另外,with-in-reader 的正文中可以有更多的表单;特别是,在同一个with-in-reader 表单中随后调用read 将从文件中返回更多表单。 (尝试使用[(read) (read)] 作为正文来获取最初的两种形式。)不过,如果我考虑过的话,我会在这个答案旁边发布你的答案。 :-)
    【解决方案2】:

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

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

    抱歉打扰各位了^_^

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2013-11-14
      • 1970-01-01
      相关资源
      最近更新 更多