2016-01-29 33 views
0

在調度程序的上下文/作用域中執行的功能是否由defmulti執行?defmulti關於綁定的上下文

我想爲調度defmethod調用設置一個動態變量*foo*

我有一種感覺,我需要將調用包裹給調度員,但要與Clojure魔術師確認。

議決

按照基本的懷疑被證實@schaueho,下面做什麼,我需要

;; Multimethod dispatch 

(defmulti consume :type) 

;; wrapper for dispatch 

(defn consume-it [{:keys [token-fn]:as expression}] 
    "Wraps consume to imbue term name resolutions" 
    (if token-fn 
    (binding [*lookup-fn* token-fn] 
     (consume expression)) 
    (consume expression))) 

回答

1

如果我理解正確的話,你想派遣函數中使用binding。調度函數的目的是返回一個值,該值將用於標識要調用的方法,而不是實際調用標識的方法。

(def ^:dynamic *dynvar* nil) 

(defmulti mymulti 
    (fn [two args] 
    (binding [*dynvar* (new-value two args)] 
     (compute-dispatch-value two args))) 

在這個例子中,compute-dispatch-value會看到*dynvar*新的綁定,但是任何調用的方法之後不會。

+0

是的,正如我在我的問題中指出的那樣,有一種鬼鬼祟祟的感覺,我需要在「綁定」(我已經完成併爲我需要的功能工作)中包裝調度調用。 –