robert.hooke;或者如何将元数据附加到 Clojure 中的函数

robert.hooke; or how to attach meta data to functions in Clojure

我正在使用 robert.hooke Clojure 库来尝试向我的应用程序中的任何函数添加行为。

这是我正在尝试做的事情:

(require '[robert.hooke :as hook])

(defn new-behavior
  [f & args]
  (let [id "test"]
    (println "The new behavior is to output the ID defined at the hook level: " id)
    (apply f args)))

(defn add-behavior!
  [id task-var]
  (hook/add-hook task-var new-behavior))

然后我会这样添加一个行为:

(defn foo [] (println "foo test"))

(add-behavior! "foo-id" #'foo)

我希望能够在这里做的是以某种方式更改 add-behavior! 函数中 var task-var 函数的元数据,然后访问来自 new-behavior 函数的新元数据。我希望能够做类似的事情(注意,这显然不起作用):

(defn new-behavior
  [f & args]
  (let [id (::behavior-id (meta f))]
    (println "The new behavior is to output the ID defined at the hook level: " id)
    (apply f args)))

(defn add-behavior!
  [id task-var]
  (alter-meta! task-var assoc-in [::behavior-id] id)
  (hook/add-hook task-var new-behavior))

(defn foo [] (println "foo test"))

(add-behavior! "foo-id" #'foo)

目前的方法行不通,因为在 add-behavior! 中它更改了 var 的元数据,而我在 new-behavior 中访问的是 new-behavior 的元数据nil.

函数

因此,这导致了两个问题:

  1. 如何访问 new-behavior 中与 function 关联的 var 的元数据?
  2. 或者,我如何更改 add-behaviorvarfunction 的元数据?

是否可以通过 partialnew-behavior 提供变量?

(defn new-behavior
  [the-var f & args]
  (let [id (::behavior-id (meta the-var))]
    (println "The new behavior is to output the ID defined at the hook level: " id)
    (apply f args)))

(defn add-behavior!
  [id task-var]
  (alter-meta! task-var assoc-in [::behavior-id] id)
  (hook/add-hook task-var (partial new-behavior task-var)))

(defn foo [] (println "foo test"))

(add-behavior! "foo-id" #'foo)

如果不进一步了解您要解决的问题,就很难判断这里是否有更好的设计。