Your first example would be better / easier / clearer / faster of you use
an anonymous closure function instead of eval
function f(a)
  g=()->length(a)
  println(g())
end

A macro should not call eval. Instead return esc(ex) to make you code
functional


On Tuesday, May 6, 2014, Tim Besard <[email protected]> wrote:

> Also, on a related note, is it possible to create a macro which transforms
> a function, but makes the result accessible in the caller's package? e.g.
> module Test
>
> export @transform
>
> macro transform(ex)
>     eval(ex)
> end
>
> end
>
> using Test
>
> @transform function foobar()
>     println("foobar")
> end
>
> function main()
>     foobar()
> end
>
> main()
>
> This testcase doesn't work due to foobar being defined in the Test
> package. I'd want to avoid having to call Test.foobar().
>
> Op dinsdag 6 mei 2014 11:34:39 UTC+2 schreef Tim Besard:
>>
>> I'm trying something with macro's, and I can't understand the following
>> behavior:
>> julia> data = [1 2 3]
>> 1x3 Array{Int64,2}:
>>  1  2  3
>>
>> julia> eval(:(println($(length(data)))))
>> 3
>>
>> julia> eval(parse("println(\$(length(data)))"))
>> ERROR: unsupported or misplaced expression $
>> Why do these behave differently?
>>
>> Placed in context, I'm trying to generate a function from within macro,
>> which on its turn generates an expression containing a the result of a
>> subexpression evaluated when the function was called. Or, in code:
>> macro outer(ex)
>>     ex = Expr(:quote, :(println($ex)))
>>     fdef = quote
>>         function inner(data)
>>             $ex
>>         end
>>     end
>>     eval(fdef)
>> end
>>
>> function inner_wanted(data)
>>     :(println($(length(data))))
>> end
>>
>> function main()
>>     @outer(length(data))
>>
>>     data =
>>
>

Reply via email to