Clojure-tagged literals::Raise an error-No dispatch macro for it.

问题描述 投票:0回答:1

tmp2srcdata_readers.clj。

{ct/G tmp2.core/foo}

tmp2srctmp2core.clj.

(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)

我应该在哪里修改代码?任何帮助将被感激

clojure literals
1个回答
0
投票

事实上,这里有两个问题。

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")

应该可以


0
投票

好了,开始工作了。

(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"]

如果你没有 cljjava 位(有些项目也会将 cljccljs 文件到单独的目录树中),您需要修改其中一个目录树。project.clj 或文件位置。

© www.soinside.com 2019 - 2024. All rights reserved.