我想创建一个可以读取文件的Clojure宏,当成功读取文件时,应该关闭流.
(import '(java.io FileReader File))
(defmacro read([x y]
`(let ~x
(try ~y
(. x close)
(catch Exception e# e#)))))
Run Code Online (Sandbox Code Playgroud)
这样称呼,
(read [stream (java.io.FileReader (java.io.File "somefile.txt"))] (. stream read)))
Run Code Online (Sandbox Code Playgroud)
导致此错误
java.lang.Exception: No such var: user/x (NO_SOURCE_FILE:8)
Run Code Online (Sandbox Code Playgroud)
有没有人有任何建议,谢谢.
too*_*ays 11
你不是在寻找with-open,除非有某种原因你想明确使用宏吗?
(defn read [file-name]
(with-open [reader (BufferedReader. (FileReader. file-name))]
(doseq [line (line-seq reader)] (println line))))
Run Code Online (Sandbox Code Playgroud)
根据ClojureDocs页面,它确保在表单末尾关闭阅读器.
希望这有帮助!