【问题标题】:Read in expressions - EOF while reading - in Clojure读入表达式 - 阅读时的 EOF - 在 Clojure 中
【发布时间】:2014-02-12 06:48:27
【问题描述】:

我想在 Closure 中读入一个(更长的)文件,其中包含正确的 LISP 语法。所以我认为最好的方法是避免使用字符串。我尝试使用以下功能:

(defn my-reader 
    [filename]
    (with-open [r (java.io.PushbackReader. (reader filename))]
        (binding [*read-eval* false]
            (loop [expr (read r :eof :end)]
                (if (= :end expr)
                    (print "The End")
                    (do
                        (println expr)
                        (recur (read r :eof :end))))))))

但是,这会在读取错误时引发 EOF。

作为一种解决方法,我已经构建了:

(defn my-reader 
    [filename]
    (with-open [r (java.io.PushbackReader. (reader filename))]
     (binding [*read-eval* false]
        (loop [expr (read r :eof :end)]
            (if (= -1 expr)
                (print "The End")
            (recur (try 
                (print (read r :eof :end))
                (catch Exception e -1))))))))

但这很丑。在How to use clojure.edn/read to get a sequence of objects in a file? 的帮助下,我的尝试是:

(defn my-reader 
    [filename]
    (with-open [r (java.io.PushbackReader. (reader filename))]
        (binding [*read-eval* false]
            (let [expr (repeatedly (partial read r :eof :theend))]
    (dorun (map println (take-while (partial not= :theend) expr)))))))

也没有工作(阅读时EOF)。但是,另一个线程中的解决方案工作正常(edn 似乎是读取文件的首选方式)。不过,我想知道为什么我的尝试不起作用。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    clojure.core/read 的语义与 clojure.tools.reader.edn/read 有点不同。

    arity-3 版本接受参数

    1. stream输入流
    2. eof-error? 一个布尔值,指定是否希望 read 在 EOF 处引发异常
    3. eof-value 到达 EOF 时返回的标记值

    所以,我认为您想将 (read r :eof :end) 替换为 (read r false :end),因为关键字是真实的。

    【讨论】:

    • ...下班后它就像一个魅力。谢谢!
    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2020-04-02
    • 2014-03-22
    • 1970-01-01
    相关资源
    最近更新 更多