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

以下是在CLJS中模拟/显示的CLJ票据中存在的问题

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

对于两者都有。鉴于这种情况,似乎不改变高级构建中的行为更好,以避免跟踪生产用户的生产错误 hard。即使这与CLJ行为略有不同。有什么看法?

0

评论者:aralo

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

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