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
.
函数
因此,这导致了两个问题:
- 如何访问
new-behavior
中与 function
关联的 var
的元数据?
- 或者,我如何更改
add-behavior
中 var
的 function
的元数据?
是否可以通过 partial
向 new-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)
如果不进一步了解您要解决的问题,就很难判断这里是否有更好的设计。
我正在使用 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
.
因此,这导致了两个问题:
- 如何访问
new-behavior
中与function
关联的var
的元数据? - 或者,我如何更改
add-behavior
中var
的function
的元数据?
是否可以通过 partial
向 new-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)
如果不进一步了解您要解决的问题,就很难判断这里是否有更好的设计。