Julia 朱莉娅有函数装饰器吗?

Julia 朱莉娅有函数装饰器吗?,julia,Julia,在某些语言(如Python)中,函数装饰器看起来像宏,位于函数定义之上。装饰器为函数本身提供了一些附加功能 Julia以任何方式支持函数装饰器的想法吗?是否可以使用宏来实现相同的目标?以下是使用宏实现此目标的一种方法: 然而,至少在我的经验中,这在惯用的Julia程序中很少出现。我首先想一想,仅仅通过使用简单的高阶函数和特征的多次分派是否可以更好地解决您的特定问题,这通常有助于更好的可组合性。以下是使用宏实现这一点的一种方法: 然而,至少在我的经验中,这在惯用的Julia程序中很少出现。我首先想

在某些语言(如Python)中,函数装饰器看起来像宏,位于函数定义之上。装饰器为函数本身提供了一些附加功能


Julia以任何方式支持函数装饰器的想法吗?是否可以使用宏来实现相同的目标?

以下是使用宏实现此目标的一种方法:


然而,至少在我的经验中,这在惯用的Julia程序中很少出现。我首先想一想,仅仅通过使用简单的高阶函数和特征的多次分派是否可以更好地解决您的特定问题,这通常有助于更好的可组合性。

以下是使用宏实现这一点的一种方法:


然而,至少在我的经验中,这在惯用的Julia程序中很少出现。我首先想一想,仅仅通过使用简单的高阶函数和特性的多次分派是否可以更好地解决您的特定问题,这通常会使其具有更好的可组合性。

为了扩展@SilvioMayolo的评论,Julia具有相当优雅的宏功能,这比Python装饰器更通用。 实际上,Julia的宏接受任何表达式作为输入,并且宏可以钩住抽象语法树以返回修改后的表达式

您要查找的关键字是元编程


您可以找到官方文档和一个方便的教程。

要扩展@SilvioMayolo的评论,Julia具有非常优雅的宏功能,这比Python装饰器更通用。 实际上,Julia的宏接受任何表达式作为输入,并且宏可以钩住抽象语法树以返回修改后的表达式

您要查找的关键字是元编程


您可以找到官方文档和一个方便的教程。

在Python中,decorator只不过是将函数作为参数并以某种方式返回修改后的函数。在Julia中,我们增加了复杂性,我们定义的函数不是一个完整的函数,而是多方法的一小部分,这增加了一点复杂性。我很好奇这样的东西是否容易实现。我还没有写过很多宏,但我认为宏是Julia中装饰方法的典型方式。它的工作方式并不完全相同,因为编译过程中会用到宏Julia是编译的,而Python是解释的。通过编写一个接受方法并返回方法的方法,您可以使一些东西更像Python的装饰器。请注意有条件地定义内部方法的问题。在Python中,decorator只不过是将函数作为参数并以某种方式返回修改后的函数。在Julia中,我们增加了复杂性,我们定义的函数不是一个完整的函数,而是多方法的一小部分,这增加了一点复杂性。我很好奇这样的东西是否容易实现。我还没有写过很多宏,但我认为宏是Julia中装饰方法的典型方式。它的工作方式并不完全相同,因为编译过程中会用到宏Julia是编译的,而Python是解释的。通过编写一个接受方法并返回方法的方法,您可以使一些东西更像Python的装饰器。请注意有条件地定义内部方法的问题。
import ExprTools

macro dec(decorator, inner_def)
    inner_def = ExprTools.splitdef(inner_def)
    outer_def = copy(inner_def)
    fname = get(inner_def, :name, nothing)
    if fname !== nothing
        @assert fname isa Symbol
        inner_def[:name] = Symbol(fname, :_inner)
    end
    outer_def[:body] = Expr(:call,
        :($decorator($(ExprTools.combinedef(inner_def)))),
        get(outer_def, :args, [])...,
        get(outer_def, :kwargs, [])...,
    )
    return esc(ExprTools.combinedef(outer_def))
end
julia> _time(f) = (x...) -> (t0=time(); val=f(x...); println("took ", time()-t0, " s"); val)
_time (generic function with 1 method)

julia> @dec _time function foo(x, y)
           return x + y
       end
foo (generic function with 1 method)

julia> foo(1, 2)
took 9.5367431640625e-7 s
3