Clojure core.typed+;datomic=没有标签id的读取器函数
我刚刚开始使用clojure和core.typed,当我使用以下代码评估Clojure core.typed+;datomic=没有标签id的读取器函数,clojure,datomic,clojure-core.typed,Clojure,Datomic,Clojure Core.typed,我刚刚开始使用clojure和core.typed,当我使用以下代码评估(检查ns'stocks.db)时,一直遇到以下错误: (ns stocks.db (:gen-class) (:require [clojure.core.typed :refer [ann HMap]])) (use '[datomic.api :only [q db] :as d]) (ann break-me [String -> (HMap)]) (defn break-me "Do I br
(检查ns'stocks.db)
时,一直遇到以下错误:
(ns stocks.db
(:gen-class)
(:require [clojure.core.typed :refer [ann HMap]]))
(use '[datomic.api :only [q db] :as d])
(ann break-me [String -> (HMap)])
(defn break-me
"Do I break cored.typed?"
[]
{:db/id #db/id[:db.part/db]})
ExceptionInfo没有标签id clojure.core/ex-info的读卡器函数(core.clj:4327)
(打断我)
的计算结果是{:db/id#db/id[:db.part/db-1000000]}
,正如您所期望的那样
与此类似,冒犯的术语肯定是#db/id
感谢您的帮助。我是Clojure和Datomic的新手,但我认为您需要使用Datomic API中的
tempid
函数生成临时id(请参阅)
所以看起来是这样的:
(ns stocks.db
(:gen-class)
(:require [clojure.core.typed :refer [ann HMap]]))
(use '[datomic.api :only [q db] :as d])
(ann break-me [String -> (HMap)])
(defn break-me
"Do I break cored.typed?"
[]
{:db/id (tempid :db.part/db)})
我在clojure.edn/read string
中遇到了类似的问题,我还没有完全弄清楚。希望对你有用
更新:
在这段代码中:达托米人似乎在做你自己。因此,在您的例子中,我认为使用tempid
会起作用,但我认为还有一个更深层次的问题,它似乎与文本#db/id
有关
更新:
这里:建议使用tempid
而不是文字
更新:
我找到了一个解决方案,也解决了我的问题。在使用clojure.core/slurp
将内容作为字符串读取后,我试图从文件中读取模式:schema.edn
使用clojure.edn/read string
,并收到类似错误,抱怨db/id
文本
我实现了这里的readall
和transact-all
函数,效果很好。似乎在使用阅读器解析#db/id
文本时存在一些隐秘的问题,但仍然没有找到确切的原因
更新:
这是使用一个名为“tagged literals”的Clojure功能,它允许您在类路径根目录下名为data\u readers.clj
的文件中定义“数据读取器”的映射,该文件应包含一个将解析标记参数的标记名和变量的映射
因此,使用这个data\u readers.clj
文件:
{minutes my.project/to-minutes
seconds my.project/to-seconds}
您可以这样做:
#minutes 3
#seconds 4
您可以在此页面底部阅读有关标记文字的内容:
但是,我仍然没有找到
#db/id
标记文字出现问题的原因。我在Clojure group论坛上发布了一个问题:更新:Ben Kamphaus提供了一个很好的解释 我不熟悉Clojure和Datomic,但我认为您需要使用Datomic API中的tempid
函数生成临时id(请参阅)
所以看起来是这样的:
(ns stocks.db
(:gen-class)
(:require [clojure.core.typed :refer [ann HMap]]))
(use '[datomic.api :only [q db] :as d])
(ann break-me [String -> (HMap)])
(defn break-me
"Do I break cored.typed?"
[]
{:db/id (tempid :db.part/db)})
我在clojure.edn/read string
中遇到了类似的问题,我还没有完全弄清楚。希望对你有用
更新:
在这段代码中:达托米人似乎在做你自己。因此,在您的例子中,我认为使用tempid
会起作用,但我认为还有一个更深层次的问题,它似乎与文本#db/id
有关
更新:
这里:建议使用tempid
而不是文字
更新:
我找到了一个解决方案,也解决了我的问题。在使用clojure.core/slurp
将内容作为字符串读取后,我试图从文件中读取模式:schema.edn
使用clojure.edn/read string
,并收到类似错误,抱怨db/id
文本
我实现了这里的readall
和transact-all
函数,效果很好。似乎在使用阅读器解析#db/id
文本时存在一些隐秘的问题,但仍然没有找到确切的原因
更新:
这是使用一个名为“tagged literals”的Clojure功能,它允许您在类路径根目录下名为data\u readers.clj
的文件中定义“数据读取器”的映射,该文件应包含一个将解析标记参数的标记名和变量的映射
因此,使用这个data\u readers.clj
文件:
{minutes my.project/to-minutes
seconds my.project/to-seconds}
您可以这样做:
#minutes 3
#seconds 4
您可以在此页面底部阅读有关标记文字的内容:
但是,我仍然没有找到
#db/id
标记文字出现问题的原因。我在Clojure group论坛上发布了一个问题:更新:Ben Kamphaus提供了一个很好的解释 这对我来说很好(没有例外)。你在使用LightTable吗,就像在另一个问题中一样?如果是这样的话,请看:不,我只是在用Clojure 1.5.1和Leiningen 2.3.4运行lein repl
。注意:它编译和运行良好,仅在评估(检查ns'stocks.db)
时给出一个错误。我在这里发布了一个关于问题的数据读取器部分的答案:这对我来说很好(没有例外)。你在使用LightTable吗,就像在另一个问题中一样?如果是这样的话,请看:不,我只是在用Clojure 1.5.1和Leiningen 2.3.4运行lein repl
。注意:它编译并运行良好,仅在评估(检查ns'stocks.db)
时出现错误。我在这里仅针对问题的数据读取器部分发布了一个答案:如何在数据读取器.clj
文件中为#db/id
指定一个条目?我不知道你是什么意思。已经有了一个#db/id的读取器宏。你能澄清一下吗?@DavidShaked你可以在datomic jar文件data\u readers.clj
文件中看到它的样子,但它应该是这样的:{db/id datomic.db/id literal}
。请注意,映射格式是新的,标记符号是键,值是一个函数(或指向函数的var),读取器可以调用该函数来读取文本。如何在data\u readers.clj
文件中为