2024 年 Clojure 调查中分享您的想法!

欢迎!请参阅 关于 页面,了解有关如何使用本指南的更多信息。

0
core.logic

我一直在工作的仓库在这里:https://github.com/aamedina/cljs.core.logic

我基本上按照 clojure.core.logic 的代码布局进行了逐字逐句的遵循,针对 ClojureScript 的需要进行了补偿,将宏移动到姐妹 .clj 文件中。我对如何组织每个文件的宏的最佳方法没有固定的意见,我所采用的是我发现最简单的方法,因为这可以避免为引用姐妹 .cljs 文件中的函数的每个引号化的语法形式进行namespace认证。

此外,我还使用 clojurescript.test 将 clojure.core.logic 的所有测试都移植了过来。

5 个答案

0

评论由:adrianm 提供

因此,我更新了仓库以更忠实地遵循现有的 cljs.core.logic 代码规范和组织结构。我非常希望得到有关如何潜在地优化代码以与 JVM 更加匹配的见解。

0

评论由:dnolen 提供

您观察到什么样的性能问题?您运行了特定的基准测试吗?

0

评论由:adrianm 提供

Appendo和membero运行速度特别慢。

(dotimes (link: i ie5) (run* (link: q) (== q true))) 的执行时间约为~4500ms,这是 JVM 的约10倍慢。

经过分析,我发现问题——非常标准的递归优化是必要的,它会在代码执行时递归地重新执行lvars(通过重统一)。例如,
对于appendo,(run 5 (link: q) (fresh (link: x y) (appendo x y q))) 将扩展成类似..

((_0) (_0 . _1) (_0 _1 . _2) ... ))

而且它很慢,因为每个新的列表实际上都需要重新遍历之前已经重统一的lvars。

这个周末我将有更多时间来调查这个问题,但我认为可能只是简单地不要默认生成唯一的lvars,因为这样,unification检查中的identical?应该能够捕捉到任何尝试的遍历。

0

评论者:munro

我一直使用clojure.core.logic和cljs.core.logic,并且因为API的不同而遇到了困难。我认为应该废弃cljs.core.logic,转而使用clojure.core.logic,因为有了新的读取条件。

cljs.core.logic是否有针对JSVm进行优化的特定实现?光看代码,它看起来相当不同,所以这些性能问题也可能是由不是最优化的算法引起的。

我可以帮忙研究让clojure.core.logic可移植,尽管我对clojure相当新手。我的策略是增加读取条件,直到测试套件在Clojurescript中通过。

0
参考:https://clojure.atlassian.net/browse/LOGIC-144(由adrianm报告)
...