习惯性地扩展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

上一篇: idiomatic way of extending clojure reify

下一篇: Clojure states within states within states