For the toy example you are right, parametric function would be better -
what I'm actually trying to do is define several `searchsortfirst`
functions, where the lt function is different.
This is because I have a vector of one immutable composite type of several
values I wish to sort and search. I could sort/search them by their first
value, second value, or third value, and there is no canonical lt for the
type.
Base.sort can be provided an anonymous function to use as lt - but
performance is absolutely critical in my use case and I need to squeeze as
much performance as I can. Benchmark's I have done have shown that using
anonymous functions slow things down. However, if I copy the searchsorted
code and modify it to contain my custom lt condition, then everything is
faster.
Therefore I wanted to make a macro that would define several of my custom
searchsortedfirst functions: If I provided it a name for the function, the
types/arguments is accepts, and then the custom lt expression. It would
return a definition of the custom function with the lt condition hard coded
in.
On Wednesday, June 17, 2015 at 8:07:11 PM UTC+1, Tom Breloff wrote:
>
> My gut reaction is that you don't want to use a macro here. Can you use a
> parametric definition:
> f{T}(vectype:T) = <do something useful with the T>
>
> or can you just use multiple dispatch:
> f{T<:FloatingPoint}(v::Vector{T}) = <something for floats>
> f{T<:Integer}(v::Vector{T}) = <something for ints>
>
> What's your use case?
>
> But to answer your question... I think this should work:
>
>
> julia> macro customFun(vectype::Expr, name::Symbol)
> quote
> function $(esc(name))(v::$(esc(vectype)))
> println(typeof(v))
> end
> end
> end
>
> julia> @customFun Vector{Int} f
> f (generic function with 1 method)
>
> julia> f(Int[])
> Array{Int64,1}
>
>
>
>
> On Wednesday, June 17, 2015 at 2:13:41 PM UTC-4, 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.
>>
>