Alos, as Mauro said, instead of manually creating the functors, packages 
like FastAnonymous.jl makes it easier for you.

On Wednesday, June 17, 2015 at 10:11:22 PM UTC+2, Kristoffer Carlsson wrote:
>
> You could also use something called functors which basically are types 
> that overload the call function. When you pass these as argument the 
> compiler can specialize the function on the type of the functor and thus 
> inline the call. See here for example for them being used effectively for 
> performance increase: https://github.com/JuliaLang/julia/pull/11685
>
> As an example I took the code for insertionsort and made it instead accept 
> an argument f which will be the functor. I then create some functors to 
> sort on the different type fields and show an example how sort is called.
>
>
> function sort!(v::AbstractVector, f, lo::Int=1, hi::Int=length(v))
>     @inbounds for i = lo+1:hi
>         j = i
>         x = v[i]
>         while j > lo
>             if f(x, v[j-1])
>                 v[j] = v[j-1]
>                 j -= 1
>                 continue
>             end
>             break
>         end
>         v[j] = x
>     end
>     return v
> end
>
> # Some type
> immutable CompType
>     a::Int
>     b::Int
>     c::Int
> end
>
>
> b = [CompType(1,2,3), CompType(3,2,1), CompType(2,1,3)]
>
> # Functors 
> immutable AFunc end
> call(::AFunc, x, y) = x.a < y.a
> immutable BFunc end
> call(::BFunc, x, y) = x.b < y.b
> immutable CFunc end
> call(::CFunc, x, y) = x.c < y.c
>
> # Can now sort with good performance
> sort!(b, AFunc())
> println(b)
> sort!(b, BFunc())
> println(b)
> sort!(b, CFunc())
> println(b)
>
>
> Now, this is of course not optimal to rip code out of base. It would be 
> better if we could pass a functor straight to Base.sort!. 
>
>
> On Wednesday, June 17, 2015 at 8:13:41 PM UTC+2, Ben Ward wrote:
>>
>> Hi, I want to create a macro with which I can create a function with a 
>> custom bit of code:
>>
>> In the repl I can do a toy example:
>>
>>
>> *name = :hi*
>>
>>
>> *vectype = Vector{Int}*
>>
>>
>> *quote**  function ($name)(v::$vectype)*
>>
>>     *println("hi")*
>>
>>   *end*
>>
>> *end*
>>
>> However if I try to put this in a macro and use it I get an error:
>>
>> *macro customFun(vectype::DataType, name::Symbol)*
>>
>>
>> *  quote**   function ($name)(v::$vectype)*
>>
>> *      println("hi World!")*
>>
>> *    end*
>>
>> *  end*
>>
>>
>>
>> *end*
>>
>> *@customFun(Vector{Int}, :hi)*
>>
>> What am I doing wrong? I'd like to use macro arguments to provide a 
>> function's name, and the datatype of the argument. I haven't used macros to 
>> define functions more complex than simple one liners.
>>
>> Thanks,
>> Ben.
>>
>

Reply via email to