到目前为止,这是我找到的解决方案,但我认为这不是非常惯用的......
任何更好的动态扩展reify的建议?
更新<!/强>
我的想法是在执行当前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"
答案 0 :(得分:1)
据我所知,你的目标是包装一个由reify创建的对象,并在对该对象的调用上注入新的行为。
一个方向是编写一个代替reify的宏,并为你提供的函数插入每个已知函数的“around”调用。使用可能如下所示:
(reifyw Object wrapf
(toString [this]
f)))
会变成:
(reify Object
(toString [this]
(wrapf f)))
另一个方向是将对对象接口的调用包装起来以插入自己的动态行为 - 这将在使用时完成,而不是具有权衡的声明点。