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")
不会。
我正在尝试编写一个从 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")
不会。