延伸clojure reify的惯用方法

时间:2014-02-13 19:28:32

标签: clojure

到目前为止,这是我找到的解决方案,但我认为这不是非常惯用的......

任何更好的动态扩展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"

1 个答案:

答案 0 :(得分:1)

据我所知,你的目标是包装一个由reify创建的对象,并在对该对象的调用上注入新的行为。

一个方向是编写一个代替reify的宏,并为你提供的函数插入每个已知函数的“around”调用。使用可能如下所示:

(reifyw Object wrapf
  (toString [this]
    f)))

会变成:

(reify Object
  (toString [this] 
    (wrapf f)))

另一个方向是将对对象接口的调用包装起来以插入自己的动态行为 - 这将在使用时完成,而不是具有权衡的声明点。