【问题标题】:How to set values in one ns from another ns?如何从另一个 ns 设置一个 ns 的值?
【发布时间】:2013-03-02 14:14:01
【问题描述】:

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

【问题讨论】:

    标签: parameters clojure namespaces function


    【解决方案1】:

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

    【讨论】:

    • 我阅读了原子文档,但仍然不清楚。一个例子对我有很大帮助。谢谢。
    • 我想我有一个解决方案(见答案),但我不确定为什么“实习生”不行。使用 atom 的解决方案:user=> (def uat (atom 4) -> 4, user=> (in-ns 'ns2), ns2=> (clojure.core/reset!user/uat 7) -> 7, ns2= > @user/uat -> 7, (in-ns 'user) -> #, user=> @uat -> 7
    【解决方案2】:

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

    创建一个类似的原子:

    (def my-state (atom 1)) (取消引用我的状态) => 1 ;; @ 扩展为 deref 调用 @我的状态 => 1

    现在可以使用 swap 进行更新:

    (交换!我的状态(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 互操作的更多信息,请参阅 Calling clojure from java

    【讨论】:

    • 感谢您的回答;它非常适合我的程序。
    • 完成。很抱歉以前没有这样做;我花了一段时间才弄清楚如何做标记。我对这些功能不是很熟悉。
    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多