1

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

4

2 回答 2

0

请使用 atom,官方文档:http: //clojure.org/atoms

于 2013-03-14T10:18:09.767 回答
0

是的,正如另一个答案指出的那样,原子是保持可变状态的最佳选择。

创建一个原子,如:

(def my-state (atom 1))

(取消引用我的状态)
=> 1

;; @ 扩展为 deref 调用
@我的状态
=> 1

现在可以使用交换更新它:

(交换!我的状态(fn [旧值] 2)
@我的状态
=> 2

您可以在可从 Java 调用的命名空间中使用它:

(ns foo.NonGUI
  (:gen-class
    :name foo.NonGUI
    :methods [#^{:static true} [setMyState [int] int]]))

(定义我的状态(原子))

(定义-setMyState
  “将我的状态设置为新值”
  [新价值]
  (交换!我的状态(fn [旧值] 新值))

在编译它并在 java 类路径上获取编译后的类文件之后,您应该能够从 Java 中使用这个命名空间:

导入 foo.NonGUI;

公共类主要{

    公共静态无效主要(字符串[]参数){
        NonGUI.setMyState(4);
    }
}

有关Java 互操作的更多信息,请参阅从 java 调用 clojure 。

于 2013-03-14T15:09:14.773 回答