It's possible to have a macro in Julia that emulates Python decorators. But 
it's a separate question whether you really want to do it, there might be 
more efficient/elegant ways to achieve the same in Julia for a specific use 
case.

Here's a macro that emulates Python decorators and an example how to use it:

julia> macro decorator(dec, func)
         name = func.args[1].args[1]
         hiddenname = gensym()
         func.args[1].args[1] = hiddenname
         quote
           $func
           const $(esc(name)) = $dec($hiddenname)
         end
       end
julia> foo(f) = x->2*f(x+10)
julia> @decorator foo function bar(x)
         return x+1
       end
julia> bar(0)
22

This is the same as in Python
In [2]: def foo(f):
   ...:     return lambda x: 2*f(x+10)
   ...: 


In [3]: @foo
   ...: def bar(x):
   ...:     return x+1
   ...: 


In [4]: bar(0)
Out[4]: 22

Of course, one can also use this for something useful :-), like:
julia> logger(f) = x-> (println("input: $x"); result = f(x); println("output: 
$result"); result)
logger (generic function with 1 method)


julia> @decorator logger baz(x)=x+1
(anonymous function)


julia> baz(3)
input: 3
output: 4
4




On Monday, May 9, 2016 at 3:42:22 PM UTC+2, Ford Ox wrote:
>
> Is it possible to write macro that will work as python decorator? 

Reply via email to