2024年的 Clojure 调查中分享你的想法!

欢迎!请查看关于页面了解此工作的更多信息。

0 投票
命名空间和变量
编辑

我感到惊讶的是,在 dev/user.clj 中的这段代码在启动时没有运行

(ns user) ; user ns is loaded by REPL startup

(println "Evaluating dev/user.clj")
(when-not (resolve 'xxx)
  (def xxx 1)
  (println "defing xxx"))

这对我来说是有效的

(defonce yyy (let [tmp 1] (println (str "deffing yyy as " tmp))
                   tmp))

在 clojurians 中也有人建议类似的做法
[https://clojurians.slack.com/archives/C053AK3F9/p1683882344251029][Slack]

(ns user)

(when-not (resolve 'xxx)
  (intern 'user 'xxx 42)
  (prn "!!!"))
这是我希望在 dev/user.clj 中实现的功能

<pre><code>
(require '[portal.api :as portal])
(defonce p
  (let [tmp (portal/open)]
    (add-tap #'portal/submit)
    tmp))

</code></pre>
糟糕,我刚刚意识到这实际上并不能帮助解决多个窗口打开的问题。当我重新进入时,窗口显然仍然会打开。:-|

但语言问题仍然是。

1 答案

+1 投票

由于没有看到您的完整项目,我无法确定,但猜测您的用户空间被配置为AOT编译(预先编译成Java类,而不是在启动时从Clojure源代码编译)。在这种情况下,编译器通常会优化在编译时可以执行的事情,而不是在启动时,所以您的 println 很可能在项目编译时发生一次,而不是每次运行应用程序时。这往往会困扰那些想要捕获应用程序启动时间的人;他们最终看到的是项目最后一次编译的时间。

理解顶级表的生命周期可能会很复杂,尤其是在编译和Clojure与JVM的交互方面。通过采用像 Componentsystem 这样的状态管理库,您可以避免与这些问题的斗争。

这是我的 deps.edn

https://github.com/jamiepratt/euler/blob/resolve/deps.edn

相关代码在 dev/user.clj 中,应该在我加入 jack 时运行

https://github.com/jamiepratt/euler/blob/resolve/dev/user.clj

Calva 允许我复制它使用的加入 jack 命令到剪贴板,以下是命令内容

pushd /Users/jamiep/Documents/clj/euler ; clojure -Sdeps '{:deps {nrepl/nrepl {:mvn/version,"1.0.0"},cider/cider-nrepl {:mvn/version,"0.28.7"}}}' -M:dev:portal -m nrepl.cmdline --middleware "[cider.nrepl/cider-middleware]" ; popd
啊,那么我们就让其他人继续讨论了,我仍然使用 Leiningen 作为我的 Clojure 构建器和启动器,所以我不知道在 deps.edn 世界中什么是被 AOT 编译的。
...