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

欢迎!请查看 关于 页面以了解更多有关如何使用本网站的信息。

0 票数
ClojureScript

4 个答案

0 票数

评论者:aralo

可以通过将 {{defn}} 宏更改为 "简单" 情况并携带函数名到函数中解决这个问题:

(core/list 'def (with-meta name m) (cons `fn (cons name fdecl)))

clojure 之所以未执行此操作,是因为: https://dev.clojure.org/jira/browse/CLJ-809

但我认为这并不是 CLJS 的问题,因为我们没有真正的变量,不能重新定义 {{def}}。

0 票数

评论者:aralo

因此,CLJ 的 tickets 中的问题在 CLJS 中被模拟/显示如下:

`
(enable-console-print!)

(defn self-call-test
[n]
(prn "inner")
(when (pos? n)

(self-call-test (dec n))))

(let [orig self-call-test]
(set! self-call-test orig)

    (fn outer [n]
      (pr "outer")
      (orig n))))

(self-call-test 2)

(def self-call-test2 self-call-test)
(fn self-call-test2

   [n]
   (prn "inner")
   (when (pos? n)
     (self-call-test2 (dec n)))))

(let [orig self-call-test2]
(set! self-call-test2 orig)

    (fn outer [n]
      (pr "outer")
      (orig n))))

(self-call-test2 2)
`

不优化时的输出

`
"outer"
"inner"
"outer"
"inner"
"outer"
"inner"

"outer"
"inner"
"inner"
"inner"
`

因此:这似乎也会破坏当前的行为,但是,在上述高级优化中给出的是:

"outer" "inner" "inner" "inner"

对于两个都适用。鉴于这一点,为了避免在生产环境中难以追踪的用户生产中的 bugs,最好在高级构建期间不更改行为。即使这与 CLJ 行为略有偏差。您怎么看?

0 票数

评论者:aralo

对此有什么想法吗?如果这个更改是可行的,我可以创建一个补丁。由于一些非常底层的数据结构函数是递归的,所以这可能会对性能产生一定影响。

0 票数
...