Macros Clojure宏读取文件

Macros Clojure宏读取文件,macros,clojure,Macros,Clojure,我想创建一个可以读取文件的Clojure宏,当文件读取成功时,流应该关闭 (import '(java.io FileReader File)) (defmacro read([x y] `(let ~x (try ~y (. x close) (catch Exception e# e#))))) 这样叫, (read [stream (java.io.FileReader (java.io.File "somefile.txt"))] (. stream read

我想创建一个可以读取文件的Clojure宏,当文件读取成功时,流应该关闭

(import '(java.io FileReader File))

(defmacro read([x y]
`(let ~x 
  (try ~y 
   (. x close)
    (catch Exception e# e#))))) 
这样叫,

(read [stream (java.io.FileReader (java.io.File "somefile.txt"))] (. stream read)))
导致此错误

java.lang.Exception: No such var: user/x (NO_SOURCE_FILE:8) 

有人有什么建议吗,谢谢。

除非有某种原因需要显式使用宏,否则您不是在寻找带有open的

(defn read [file-name]
  (with-open [reader (BufferedReader. (FileReader. file-name))]
    (doseq [line (line-seq reader)] (println line))))
根据,它确保在表单末尾关闭读卡器

希望这有帮助

是的,如果我引用“~x”,则会引发此异常


但我只有50%确信我的答案是有意义的。

您能提供更多关于您收到的错误消息的信息吗?这是运行时错误还是编译时错误?@pieterbride java.lang.Exception:在宏的第4行没有这样的var:user/x(没有源文件:8),“x”不是未加引号的。这仍然有很多错误…是的,如果我引用“~x”这个异常被抛出,它是否执行与open类似的功能?或者你想做一些完全不同的事情?如果它是相同的,可能值得阅读源代码,我链接到的ClojureDocs页面包含函数的源代码,如果您想阅读它。。。
<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: close for class clojure.lang.PersistentVector>
(import '(java.io FileReader File))

(defmacro read([fname]
`(try
   (let [stream# (FileReader. (File. ~fname))
         rtnval (. stream# read)]
     (do 
       (. stream# close)
       rtnval))
   (catch Exception e# e#)))