2024 Clojure状态调查!分享您的观点。

欢迎!请参阅关于页面以了解更多有关如何操作的详细信息。

0
ClojureScript

这是对以下问题的回归

https://dev.clojure.org/jira/browse/CLJS-275

4 个答案

0

由:aralo

可以通过将“simple”情况中的{{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票据中的问题在以下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

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

(self-call-test 2)

(def self-call-test2
(fn self-call-test2

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

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

    (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"

对于两种。鉴于这一点,似乎最好在高级构建期间不更改行为,以避免为用户查找难以追踪的生产错误。即使这与CLJ行为略有偏差。有什么看法?

0

由:aralo

对此有什么想法吗?如果这个改动可行,我可以创建一个补丁。由于几个底层数据结构函数是递归的,这可能会在性能上带来一些影响。

0
参考:[https://clojure.atlassian.net/browse/CLJS-2038](https://clojure.atlassian.net/browse/CLJS-2038)(由 aralo 报告)
...