defmulti的上下文与绑定有关

时间:2016-01-29 11:34:01

标签: clojure

defmulti调度的函数是否在调度程序的上下文/范围内执行?

我想为调度*foo*电话设置动态变量defmethod

我有一种感觉,我需要将调用包裹给调度员,但想与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 个答案:

答案 0 :(得分: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*的新绑定,但之后的任何调用方法都不会。