IllegalArgumentException: 没有方法的实现: :as-file of protocol: #'clojure.java.io/Coercions found for class: clojure.lang.Symbol

IllegalArgumentException: No implementation of method: :as-file of protocol: #'clojure.java.io/Coercions found for class: clojure.lang.Symbol

我正在尝试编写一个从 ClojureScript 中使用的宏来处理 Reagent 应用程序的文件 I/O。我收到此错误:

IllegalArgumentException: No implementation of method: :as-file of protocol: #'clojure.java.io/Coercions found for class: clojure.lang.Symbol

当我尝试执行以下操作时:

(def file-string "/Users/luciano/Dropbox/projects/test/resources/blog/test.md")
(get-file file-string)

但我可以做到这一点:

(get-file "/Users/luciano/Dropbox/projects/test/resources/blog/test.md")

这是宏:

(defmacro get-file [fname]
  (slurp (io/file fname)))

我做错了什么?

你不应该为此使用宏。

最好将宏视为嵌入在源代码中的编译器扩展

您只需要一个常规函数,例如:

(defn get-file 
  [fname]
  (slurp (io/file fname)))

就从 Reagent 应用程序执行 I/O 而言,我不确定您的目标是什么。

这意味着您正在尝试使用在运行时没有值的符号调用宏。

(def my-file "foo.txt")
(def file-str (get-file my-file))

将在

期间工作
(defn foo [s]
  (get-file s))

(foo "foo.txt")

不会。