习惯性地扩展clojure的方式
到目前为止,这是我找到的解决方案,但我相信这不是很习惯......
任何更好的建议来动态扩展通知?
UPDATE!
我的想法是在执行当前reify实现的特定函数之前,将调试调用添加到println。在提供的示例中,我将一个简短的字符串添加到当前的实现中。 其他情况可能是您可以在AspectOrientedProgramming上找到的调整或常见方面
谢谢!
(def r (let [f "foo"]
(reify Object
(toString [this]
f))))
(str r) ; == "foo"
(def r-extended (let [f "extended"]
(reify Object
(toString [this]
(str f "-"(str r))))))
(str r-extended) ; == "extended-foo"
据我可以告诉你的目标是包装由reify创建的对象,并在对该对象的调用中注入新的行为。
一个方向是编写一个代替reify的宏,并为每个指定的函数插入一个“around”调用给你提供的函数。 使用可能看起来像这样:
(reifyw Object wrapf
(toString [this]
f)))
这将变成:
(reify Object
(toString [this]
(wrapf f)))
另一个方向是将对对象的接口的调用包装成插入自己的动态行为 - 这将在使用时完成,而不是在折衷点上进行折衷。
链接地址: http://www.djcxy.com/p/66879.html