我目前正在爲我在clojure中編寫的掃雷遊戲開發一個簡單的事件調度程序。如何唯一標識一個給定的clojure函數?
作爲起點我想到具有這樣的:
(def receivers (atom {}))
隨着該附加一個給定的功能,以事件的特定地圖每個事件採用一組嵌套的,例如一個寄存器的功能{:do-sth#{func1 func2}}
據我所知,只要你再給函數名稱空間添加一個函數,它就會有不同的身份,這當然有道理,但讓我的方法失敗。
有沒有一種方法來唯一標識可能作爲參數傳入的函數?否則,我將不得不爲每個我希望儘可能避免的函數提供一個唯一的ID。
UPDATE
與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)
「只要你再添加一個函數到名稱步調「是由於代碼重新加載,這是讓你的問題? – clyfe
是的,可能沒有「現實生活中的問題」,但我目前使用的是lighttable,一旦我運行我的東西,它會在原子保持原樣時再次添加函數。 – u6f6o
我想過爲函數添加一些元數據,並在它不存在的情況下拋出異常。但對我來說看起來像一個骯髒的解決方法 – u6f6o