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

欢迎!请查阅 关于 页面了解有关如何使用的更多信息。

0投票
语法和读者
关闭

最小化案例

`
(fn foo [x]
(if true

(^:once fn* []
 ;; x is not cleared here
 x)))

`

这是一个严重的错误,因为它意味着 Clojure 编译器在 FNONCE 中内部提升到循环或 try/catch 表达式中的每个局部变量,在条件分支中目前无法清除。

作为一个具体的例子,如下所示(在 Slack 中报告):

`
;; 这会导致 OOM
(defn test1 [x]
(if true

(do
  (try (doseq [_ x] _))
  1)
0))

(test1 (take 1000000 (range)))

;; 这不会导致 OOM
(defn test2 [x]
(do

(try (doseq [_ x] _))
1))

(test2 (take 1000000 (range)))

`

方法:如果不设置新的清除框架,则函数为 ^:once 并且存在现有清除框架
补丁: 0001-CLJ-2145-fix-clearing-of-locals-closed-over-by-a-FNO.patch

注释:已关闭,修复了 Clojure 1.12.0-rc1 和 1.11.4

1 个回答

0投票
参考: https://clojure.atlassian.net/browse/CLJ-2145(由 bronsa 报告)
...