如何在一个ns内设置另一个ns的值?

时间:2013-03-14 09:42:48

标签: parameters clojure namespaces function

我有两个命名空间:第一个是clojuresque java中的gui,第二个是常规clojure。用户在gui中输入值;这些需要'传递'到非gui ns中的'set'值。我已经读过在defn中使用def是不好的做法,即使它有效。在我寻找解决这个问题的过程中,我找到了实习生的功能。实习生是一个可以接受的解决方案,还是应该使用别的东西?

2 个答案:

答案 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