this is awesome

thanks!

On Wednesday, February 24, 2016 at 3:32:48 PM UTC+1, Tom Breloff wrote:
>
> Enjoy:
>
>
> julia> macro n(expr::Expr)
>            @assert expr.head == :function
>            s = expr.args[1].args[2]
>            if isa(s,Expr) && s.head == :(::)
>                s = s.args[1]
>            end
>            unshift!(expr.args[2].args, :(n = length($s)))
>            esc(expr)
>        end
>
> julia> macroexpand(:( @n function f(x,y)
>            println("length of x is $n")
>        end))
> :(function f(x,y)
>         n = length(x) # none, line 2:
>         println("length of x is $(n)")
>     end)
>
> julia> @n function f(x,y)
>            println("length of x is $n")
>        end
> f (generic function with 1 method
>
> julia> @n function f(x::Vector{Int},y)
>            println("INTVEC: length of x is $n")
>        end
> f (generic function with 2 methods)
>
> julia> f(rand(4),rand(5))
> length of x is 4
>
> julia> f(rand(Int,4),rand(5))
> INTVEC: length of x is 4
>
>
> On Wed, Feb 24, 2016 at 9:03 AM, Alex <[email protected] <javascript:>> 
> wrote:
>
>> Hi everybody,
>>
>> I have several functions operating on one dimensional vectors. 
>>
>> Within each function the first thing I do is to define variable n holding 
>> the length of input vector x:
>>
>> n = length(x)
>>
>> Is that possible to factor out this pattern somehow from all functions 
>> definitions? 
>>
>> (...like 'traits' in Scala)
>>
>> I mean, to make variable n automatically defined as a length of the first 
>> argument (which is always a one dimensional vector) of each function?
>>
>>
>>
>

Reply via email to