2024 Clojure状态调查!中分享您的看法。

欢迎!请参阅关于页面以了解更多有关此信息的工作方式。

0
core.logic

将一个变量与一个固定长度的向量或列表统一是非常常见的,例如 {{(== q (list a b))}},然后定义更多关于 {{a}} 和 {{b}} 的目标,希望能定义查询的 * 结果格式。然而,如果使用集合做同样的事情,则会得到一个 StackOverflowError。

示例

`
(run* [q]
(fresh [a b]

(== q #{a b})  ;; StackOverflowError
;;(== q [a b]) ;; works
;;(== q (list a b)) ;; works, too
(conde [(== a 1)] [(== a 2)] [(== a 3)])
(conde [(== b 1)] [(== b 2)] [(== b 3)])))

`

这里想要表达的基本意思是,{{a}} 和 {{b}} 的顺序不重要,这样 * } 就会给我唯一的分段。

回溯是

`

                 logic.clj:  231  clojure.core.logic/walk*/fn
                 logic.clj:  984  clojure.core.logic/eval8917/fn
             protocols.clj:   55  clojure.core.logic.protocols/eval7398/fn/G
                 logic.clj:  229  clojure.core.logic/walk*
                 logic.clj:  233  clojure.core.logic/walk*/fn
                 logic.clj:  984  clojure.core.logic/eval8917/fn
             protocols.clj:   55  clojure.core.logic.protocols/eval7398/fn/G
                 logic.clj:  229  clojure.core.logic/walk*
                 logic.clj:  233  clojure.core.logic/walk*/fn
                 logic.clj:  984  clojure.core.logic/eval8917/fn
             protocols.clj:   55  clojure.core.logic.protocols/eval7398/fn/G

[...]
`

1 答案

0
...