我一直很喜欢Clojure core.logic,但我碰到了一堵墙。我需要能够使用数据库,无论是否使用SQL,而不是内存数据结构。当我环顾四周时,我看到提到to-stream
函数,但没有使用它的实例。
有没有人有一个将core.logic与数据库一起使用的好例子?
答案 0 :(得分:5)
正如有人在评论中已经建议的那样,请查看core.logic repository中的Datomic示例。基于这个例子,你可以想象写下这样的东西:
(defn query [db query-string out]
(fn [a]
(to-stream
(map (fn [result] (unify a out result))
(db-query db query-string)))))
所有core.logic目标只返回一个替换映射a
的闭包(你当然可以随意调用它)。基本上,您需要映射结果并将其与out
中的a
统一起来。
然后你可以想象编写一个core.logic程序,如下所示:
(run* [q]
(fresh [row]
(query some-db "... some query string ..." row)
(some-other-goal row q)))