Clojure宏读取文件

Sil*_*ail 2 macros clojure

我想创建一个可以读取文件的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页面,它确保在表单末尾关闭阅读器.

希望这有帮助!