如何唯一地识别给定的clojure函数?

时间:2015-09-11 21:09:52

标签: clojure identity

我目前正在研究一个简单的事件调度程序,用于我用clojure编写的扫雷游戏。

作为一个起点,我想到了类似的东西:

(def receivers (atom {}))

使用寄存器功能将给定函数附加到具有每个事件的嵌套集的特定事件映射,例如, {:do-sth#{func1 func2}}

据我所知,只要再次向命名空间添加一个函数,它就会有一个不同的标识,这当然有意义,但让我的方法失败。

有没有办法唯一地识别可能作为参数传入的函数?否则,我必须为每个功能提供一个唯一的id,如果可能的话我想避免。

更新

根据clyfe的建议,我最终采用了以下第一种方法:

(def receivers (atom {}))

(defn register 
  [event wrapped-function]
  (if 
    (var? wrapped-function)    
    (swap! receivers 
           #(assoc %1 %2 (conj (or (get %1 %2) #{}) %3))
           event 
           wrapped-function)
    (throw (IllegalStateException. 
            "wrapperd function must be a var"))))


(defn bar
  []
  "bar")


(register :foo #'bar)

1 个答案:

答案 0 :(得分:1)

如果问题是由于代码重新加载造成的,你可以将函数的变量存储在集合{:ev #{#'f1 #'f2}}中,并在重新加载后保持不变:

user=> (defn foo [] 1)
#'user/foo
user=> foo
#<user$foo user$foo@540e6cef>
user=> (def f1 foo)
#'user/f1
user=> (def f2 #'foo)
#'user/f2
user=> (defn foo [] 2)
#'user/foo
user=> foo
#<user$foo user$foo@35d4a23f>
user=> (f1)
1
user=> (f2)
2