我刚开始使用clojure和core.typed,并在使用以下代码评估(check-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)
(break-me)
按照您的预期评估为{:db/id #db/id[:db.part/db -1000000]}
。
与this unanswered question类似,违规字词肯定是#db/id
。
感谢您的帮助。
答案 0 :(得分:4)
我是Clojure和Datomic的新手,但我认为您需要使用tempid
函数生成您的临时ID,该函数是Datomic API的一部分(请参阅http://docs.datomic.com/clojure/index.html#datomic.api/tempid)
所以它看起来像这样:
(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
有类似的问题,我还没有弄明白。希望对你有用。
<强>更新强>
在这段代码中:https://github.com/Datomic/codeq/blob/master/src/datomic/codeq/core.clj Datomic人似乎正在做你自己。因此,在我的情况下,我认为使用tempid
会有效,我认为这是一个更深层次的问题,而且它似乎与文字#db/id
有关。
<强>更新强>
在此处:https://github.com/Datomic/day-of-datomic/blob/master/samples/literals_vs_code.clj建议使用tempid
而不是文字。
<强>更新强>
我找到了一个解决方案,也解决了我的问题。我尝试使用schema.edn
使用clojure.edn/read-string
在使用clojure.core/slurp
读取内容作为字符串后使用#db/id
读取我的架构,并且抱怨read-all
字面值时出现类似错误。
我实施了此处找到的transact-all
和#db/id
函数:https://github.com/Datomic/day-of-datomic/blob/053b3bd983d165b8fa7c0c039712fb1cb75eddf3/src/datomic/samples/io.clj,它运行正常。使用阅读器解析data_readers.clj
文字时似乎存在一些偷偷摸摸的问题,但仍然没有找到原因。
<强>更新强>
这是使用名为&#34;标记文字&#34;的Clojure功能。这允许您定义数据读取器的地图&#34;在类路径根目录中名为data_readers.clj
的文件中,该文件应包含标记名称和变量的映射,用于解析标记的参数。
使用此{minutes my.project/to-minutes
seconds my.project/to-seconds}
文件:
#minutes 3
#seconds 4
你可以这样做:
#db/id
您可以在本页底部阅读有关标记文字的内容:http://clojure.org/reader。
但是,我仍然没有找到{{1}}标记文字问题的原因。我在Clojure小组论坛上发布了一个问题:https://groups.google.com/forum/#!topic/datomic/Fi7iXps2npw。 更新: Ben Kamphaus在那里提供了一个很好的解释。