我有两个命名空间:第一个是clojuresque java中的gui,第二个是常规clojure。用户在gui中输入值;这些需要'传递'到非gui ns中的'set'值。我已经读过在defn中使用def是不好的做法,即使它有效。在我寻找解决这个问题的过程中,我找到了实习生的功能。实习生是一个可以接受的解决方案,还是应该使用别的东西?
答案 0 :(得分:0)
请使用来自官方的atom,doc:{{3p>
答案 1 :(得分:0)
是的,正如另一个答案所指出的那样,原子是维持可变状态的最佳选择。
创建一个像:
的原子(def my-state (atom 1)) (deref my-state) => 1 ;; @ expands to a deref call @my-state => 1
现在可以使用swap:
进行更新(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互操作的详细信息,请参阅Calling clojure from java。