2016-01-29 28 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

是的,正如我在我的问题中指出的那样,有一种鬼鬼祟祟的感觉,我需要在“绑定”(我已经完成并为我需要的功能工作)中包装调度调用。 –