Parameters 如何在一个ns和另一个ns中设置值?

Parameters 如何在一个ns和另一个ns中设置值?,parameters,clojure,namespaces,function,Parameters,Clojure,Namespaces,Function,我有两个名称空间:第一个是clojure式java中的gui,第二个是常规clojure中的gui。用户在gui中输入值;这些需要在非gui ns中“传递”到“设置”值。我已经读到,在defn中使用def是一种糟糕的做法,即使它是有效的。在我搜索解决这个小问题的过程中,我找到了intern函数。intern是一个可接受的解决方案,还是我应该使用其他解决方案?请使用atom,Official的文档:是的,正如另一个答案所指出的,原子是维持可变状态的最佳选择 创建一个原子,如: (def my-st

我有两个名称空间:第一个是clojure式java中的gui,第二个是常规clojure中的gui。用户在gui中输入值;这些需要在非gui ns中“传递”到“设置”值。我已经读到,在defn中使用def是一种糟糕的做法,即使它是有效的。在我搜索解决这个小问题的过程中,我找到了intern函数。intern是一个可接受的解决方案,还是我应该使用其他解决方案?

请使用atom,Official的文档:

是的,正如另一个答案所指出的,原子是维持可变状态的最佳选择

创建一个原子,如:

(def my-state (atom 1)) (deref my-state) => 1 ;; @ expands to a deref call @my-state => 1 现在可以使用交换进行更新:

(swap! my-state (fn [old-value] 2) @my-state => 2 您可以在可从Java调用的命名空间中使用:

(ns foo.NonGUI (:gen-class :name foo.NonGUI :methods [#^{:static true} [setMyState [int] int]])) (def my-state (atom)) (defn -setMyState "Set my state to new-value" [new-value] (swap! my-state (fn [old-value] new-value)) 在编译该名称空间并在Java类路径上获取编译后的类文件后,您应该能够从Java使用该名称空间:

import foo.NonGUI; public class Main { public static void main(String[] args) { NonGUI.setMyState(4); } }
有关Java互操作的更多信息,请参阅。

我阅读了atom文档,但仍然不清楚。举个例子对我很有帮助。谢谢。我想我有一个解决办法,请看答案,但我不确定为什么“实习生”不好。使用atom的解决方案:user=>def uat atom 4->4,user=>在ns的ns2中,ns2=>clojure.core/reset!user/uat 7->7,ns2=>@user/uat->7,在ns的user->中,user=>@uat->7感谢您的回答;我的节目马上就要开始了。对不起,以前没有这样做;我花了一段时间才想出如何做标记。我对这些功能不是很熟悉。