Macros Clojure宏读取文件
我想创建一个可以读取文件的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
(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#)))