【问题标题】:clojure: override function applicationclojure:覆盖函数应用程序
【发布时间】:2016-05-19 18:25:02
【问题描述】:

是否可以在 Clojure 中覆盖函数应用程序的行为?

例如,我想创建一个命名空间,其中:

(+ 2 2)

通过如下宏计算常量5

(defmacro app [& args] 5)

【问题讨论】:

  • 您没有指定宏 app 和表单 (+ 2 2) 之间的关系。请明确说明您要做什么。
  • 我希望宏 app 改变命名空间中每个函数应用程序的行为。包括(+ 2 2) 以及(+ 1 2 3)(f x) 用于任何功能f

标签: clojure macros metaprogramming


【解决方案1】:

+ 只是一个函数,因此您可以为您的命名空间排除对 clojure.core/+ 的引用,然后在该命名空间中定义您自己的添加函数。

Clojure 没有为这个命名空间中的函数应用程序的概念提供一个通用的钩子。开发工具所做的是读取包含函数的所有符号的名称空间,然后将它们与执行跟踪的包装函数挂钩。这只会影响发生这种情况时命名空间中存在的函数,因此它不如您要求的通用。

有关更多示例,请参阅 clojure.tools.traceRobert Hooke

【讨论】:

  • 很好,但我可以覆盖应用程序吗?
  • 这里说的应用是指调用函数的效果以外的意思吗?也许具有所需输出的示例可以帮助我理解
  • 你是在问是否可以改变所有函数调用的行为?
  • 是的。我在问我是否可以改变命名空间中所有函数调用的行为。使用示例:代码运行时每次调用函数时执行打印语句。
  • 我将此添加到我的答案中
猜你喜欢
  • 2021-07-29
  • 2021-08-26
  • 2012-08-29
  • 2010-10-25
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
相关资源
最近更新 更多