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

欢迎!有关如何使用此功能的更多信息,请参阅关于页面。

0
ClojureScript

4 个答案

0

评论者:aralo

可以通过将“简单”情况下的宏{{defn}}更改为将函数名称传递给函数来解决此问题

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

由于<附件 href="https://dev.clojure.org/jira/browse/CLJ-809" target="_blank">https://dev.clojure.org/jira/browse/CLJ-809,这个行为没在Clojure中做

我认为这在ClojureScript中不是一个问题,因为我们没有真正的变量,而且无法重新定义{{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"

对两者都适用。考虑到这一点,在高级构建期间不更改行为似乎更好,以避免用户难以追踪的生产缺陷。即使这与Clojure行为略有不同。有什么想法吗?

0
by

评论者:aralo

对此有任何想法吗?如果这个修改可以,我可以创建一个补丁。这可能会在性能方面产生一点影响,因为有几个非常底层的数据结构函数是递归的。

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