根据Datomic(在样本/西雅图下)附带的'geting-started.clj'文件的第54行,我应该能够在查询中使用pull函数,如下所示:
(def pull-results (q '[:find (pull ?c [*]) :where [?c :community/name]] (db conn)))
Run Code Online (Sandbox Code Playgroud)
但是,在下面的代码中我收到一个错误:IllegalArgumentException Argument [*] in:find不是变量datomic.query/validate-query(query.clj:315)
(defn get-tag [] (d/q '[:find (d/pull ?e [*])
:where [?e :tag.tag/term]] (db conn)))
Run Code Online (Sandbox Code Playgroud)
现在,在我眼里,这两个人的构造相似.再加上从http://docs.datomic.com/clojure/#datomic.api/pull读取的pull函数api 似乎是:
(pull db pattern eid)
Run Code Online (Sandbox Code Playgroud)
我会说自从编写西雅图代码以来,API已经发生了变化.我对么?如果没有,这里发生了什么.谢谢
正如评论者指出的那样,问题是传递datomic.api/pull函数而不是使用pull表达式.一些澄清点:
您不是pull在查询中调用函数,而是在子句中使用一个名为pull expression的特殊表达式find.请注意,查询接受数据结构文字(为什么必须使用quote/ ').该pull表达式是部分查询语法和一些数据记录分析器识别,因而具有不同的调用的API Datomic的拉动作用不是直接调用.