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 中也向我建议了类似的方法
[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>
糟糕,我刚刚意识到这实际上并不能帮助解决多个 portal 窗口打开的问题。它们显然在我重新连接时仍然会打开。:-|

但是,语言问题仍然存在。

1 个回答

+1

没有看到您的完整项目,我无法确定,但猜测您的user命名空间被配置为AOT编译(提前编译成Java类,而不是在启动时从Clojure源代码编译)。在这种情况下,编译器通常会优化在编译时可以完成的而不是在启动时可以完成的事情,所以您的println可能只在编译项目时发生一次,而不是每次运行您的应用程序时。这常常让那些试图在var中捕获应用程序启动时间的用户感到困惑;他们最终看到的是项目最后一次编译的时间。

理解最顶层形式的生命周期可能很棘手,特别是当涉及到编译以及Clojure与JVM之间的交互时。通过采用像Componentsystem这样的状态管理库,您就不必处理这些问题,这也是其中的一个好处。

以下是我的deps.edn

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

有关代码在dev/user.clj中,并且我应该启动机器正常运行

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

Calva允许我将使用的启动机器命令复制到剪贴板,这里就是它

cd /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]"; cd ..
啊,那我们就让其他人来捡起讨论吧,我仍然使用Leiningen作为我的Clojure构建器和启动器,所以我不知道在deps.edn的世界里是什么AOT编译的。
...