首页 > 解决方案 > Clojure-tagged literals::Raise an error-No dispatch macro for it

问题描述

tmp2/src/data_readers.clj

{ct/G tmp2.core/foo}

tmp2/src/tmp2/core.clj

(ns tmp2.core)

(defn foo
  [x]
  (println x "Hello, World!"))

(defn -main
  [& args]

  (println "Hello, World!")
  (foo 123)
  (#ct/G "abc"))

在项目目录中“lein run”时,显示结果“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)

我应该在哪里更改代码?任何帮助,将不胜感激

标签: clojureliterals

解决方案


好的,开始工作了。

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

请注意数据读取器文件的位置和内容。它必须位于类路径的根目录。在这种情况下是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读取源代码文件、编译或执行测试之前,会调用标记文字的读取器。


关于类路径的根

这由以下条目控制 Lein 项目projects.clj

  :source-paths            ["src/clj"]
  :java-source-paths       ["src/java"]
  :test-paths              ["test/clj"]

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


推荐阅读