core.typed + datomic =标签ID没有读卡器功能

时间:2014-08-04 13:58:04

标签: clojure datomic clojure-core.typed

我刚开始使用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

感谢您的帮助。

1 个答案:

答案 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在那里提供了一个很好的解释。