【问题标题】:idiomatic way of extending clojure reify扩展clojure reify的惯用方式
【发布时间】:2014-03-12 21:25:02
【问题描述】:

到目前为止,这是我找到的解决方案,但我相信它不是很地道......

动态扩展 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"

【问题讨论】:

  • 请补充一些关于为什么需要扩展 reify 的散文 - 你真正想要解决的目标是什么?
  • 好主意@Shepmaster!现在更新了一个描述问题

标签: clojure


【解决方案1】:

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

一个方向是编写一个宏来代替 reify 并将每个 reified 函数的“环绕”调用插入到您提供的函数中。使用可能看起来像这样:

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

会变成:

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

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

【讨论】:

  • 非常感谢亚历克斯!能否请您提供描述最后一个方向的示意图代码,我不太明白
猜你喜欢
  • 1970-01-01
  • 2012-08-31
  • 2014-02-21
  • 2014-12-09
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多