{ct/G tmp2.core/foo}
(ns tmp2.core)
(defn foo
[x]
(println x "Hello, World!"))
(defn -main
[& args]
(println "Hello, World!")
(foo 123)
(#ct/G "abc"))
当在项目目录下 "lein运行 "时,显示 "abc Hello, World!"的结果,但出现错误。
Caused by: java.lang.RuntimeException: No dispatch macro for: c
at clojure.lang.Util.runtimeException(Util.java:221)
at clojure.lang.LispReader$DispatchReader.invoke(LispReader.java:851)
at clojure.lang.LispReader.read(LispReader.java:285)
at clojure.lang.LispReader.readDelimitedList(LispReader.java:1398)
at clojure.lang.LispReader$ListReader.invoke(LispReader.java:1243)
at clojure.lang.LispReader.read(LispReader.java:285)
at clojure.lang.LispReader.readDelimitedList(LispReader.java:1398)
at clojure.lang.LispReader$ListReader.invoke(LispReader.java:1243)
at clojure.lang.LispReader.read(LispReader.java:285)
at clojure.lang.LispReader.read(LispReader.java:216)
at clojure.lang.Compiler.load(Compiler.java:7630)
我应该在哪里修改代码?任何帮助将被感激
事实上,这里有两个问题。
1) 你的 foo
函数返回 nil
而且似乎读者函数不能返回字面的nil。所以你必须从 foo
:
(defn foo [x]
(println x "Hello, World!")
:something)
或者,如果你真的需要 nil
在生成的代码中,你可以这样做。
(defn foo [x]
(println x "Hello, World!")
'(quote nil))
2)第二个问题是,你实际上是想在这里调用你的标签应用的结果。
(#ct/G "abc")
语法是 #tag value
在读取时用 (tag-fn value)
当你使用额外的一对parens时,你的情况就是这样。
((foo "abc"))
而且,就像... foo
功能返回 foo-return-value
然后,它就被留在了 (foo-return-value)
,而这,又会导致错误。
所以,。
(defn foo [x]
(println x "Hello, World!")
:nothing)
(defn -main
[& args]
(println "Hello, World!")
(foo 123)
#ct/G "abc")
应该可以
好了,开始工作了。
(ns tst.demo.core
(:use demo.core tupelo.core tupelo.test))
(defn foo
[x]
(println :foo-reader x)
x)
(dotest
(println :test-foo-plain)
(foo 123)
(println :test-foo-reader)
(println #ct/G "abc")
(println :test-leave))
注意Data Readers文件的位置和内容。 它必须在classpath的ROOT处。在本例中,它的位置是 src/clj
:
~/expr/demo > cat src/clj/data_readers.clj
{ct/G tst.demo.core/foo}
和测试结果。
> lein test
:foo-reader abc ; <====== NOTICE!
-------------------------------
Clojure 1.10.1 Java 14
-------------------------------
:test-foo-plain
:foo-reader 123
:test-foo-reader
abc
:test-leave
注意: foo
当读取源代码文件时,在编译或执行测试之前,就调用了标记文字的阅读器。
关于classpath的根
这是由Lein项目中的这些条目来控制的。projects.clj
:
:source-paths ["src/clj"]
:java-source-paths ["src/java"]
:test-paths ["test/clj"]
如果你没有 clj
和 java
位(有些项目也会将 cljc
和 cljs
文件到单独的目录树中),您需要修改其中一个目录树。project.clj
或文件位置。