clojure:覆盖函数应用程序

clojure:覆盖函数应用程序,clojure,macros,metaprogramming,Clojure,Macros,Metaprogramming,是否可以在Clojure中重写函数应用程序的行为 例如,我想创建一个名称空间,其中: (+ 2 2) 通过以下宏计算为常量5: (defmacro app [& args] 5) +只是一个函数,因此对于您的命名空间,可以排除对clojure.core/+的引用,然后在该命名空间中定义您自己的添加函数 Clojure没有为此命名空间中的函数应用程序的概念提供通用钩子。开发工具所做的是读取包含函数的所有符号的名称空间,然后使用进行跟踪的包装函数将它们挂钩。这只会影响发生这种情况时命名空

是否可以在Clojure中重写函数应用程序的行为

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

(+ 2 2)
通过以下宏计算为常量
5

(defmacro app [& args] 5)

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

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


有关这方面的更多示例,请参见和

这很好,但我可以重写应用程序吗?你是说在这里调用函数时,除了调用函数的效果之外,还有什么别的意思吗?也许一个具有所需输出的示例可以帮助我理解您是否询问是否可以在任何地方更改所有函数调用的行为?是的。我在问是否可以改变名称空间中所有函数调用的行为。示例用法:每次在代码运行时调用函数时执行打印语句。我将此添加到回答中。您不需要指定宏
app
和表单
(+2)
之间的关系。请明确说明您正试图执行的操作。我希望宏
app
更改命名空间中每个函数应用程序的行为。包括
(+2)
以及
(+1+2 3)
(f x)
用于任何函数
f