【问题标题】:Clojure: Compile time insertion of pre/post functionsClojure:编译时插入前/后函数
【发布时间】:2012-05-29 02:57:37
【问题描述】:

这是Clojure: pre post functions的后续行动

目标

对于每个 Clojure 函数,我都希望有一个执行的 prepost 函数:

  • 就在函数被评估之前
  • 函数返回后

    现在,我想在我的 *.clj 文件中执行此 所有 函数。

    我希望(这也是一个学习练习)在 Clojure 编译器级别执行此操作。

问题:

我该如何开始呢?我应该阅读 Clojure 编译器源代码的哪一部分?我应该了解有关 Clojure 编译器内部的哪些文档/教程?

谢谢!

【问题讨论】:

    标签: clojure


    【解决方案1】:

    首先,总的来说,这听起来有点疯狂。几乎可以肯定有更好的方法来实现任何明智的目标(即,这是尖叫“XY Problem”)。但是只要你说它只是为了学习练习,那很好:-)

    在破解编译器之前,我可以想到一些您可能需要考虑的策略:

    • 创建您自己的defn 宏,在创建函数时进行包装。显然,您需要确保使用您自己的 defn 版本而不是内置版本。可能是最简单的解决方案。
    • 在运行时(加载后)遍历您的命名空间,并将所有函数重新定义为同一函数的封装版本。可能会有点混乱,但肯定会增强您对命名空间的理解:-)

    如果您真的想破解编译器,进行此更改最简单的地方可能就是在 core.clj 中破解 defn

    【讨论】:

    • 我可能会将fn 包装在它自己的宏中,因为defn 只是一个方便的宏,用于定义函数并将它们分配给符号?
    • 是的,你可以包装fn,但如果是这样我认为你还需要重新定义defn,因为它直接引用clojure.core/fn而不是你自己的版本....
    • 谢谢!我真的很欣赏这些有见地+有用的解决方案(而不是我期待的“你为什么要这样做???”的浪潮:-)。
    • @mikera:你应该去回答我的新问题,这样你就可以成为 3/3 :-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2011-03-08
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多