Hello,
I ran into some strange behavior with a piece of code that takes in Julia
expressions, transforms them, and then evaluates them. Here is a minimal
example:
let
> function make_expr(x)
> body = x * 2
> quote
> function get()
> $body
> end
> end
> end
> ex1 = make_expr(1)
> f1 = eval(ex1)
> ex2 = make_expr(2)
> f2 = eval(ex2)
> println(ex1)
> println(ex2)
> println(code_lowered(f1, ()))
> println(code_lowered(f2, ()))
> println(f1())
> println(f2())
> end
And here is the output I get when running this with Julia 0.3.2
(8227746b95):
begin
> function get()
> 2
> end
> end
> begin
> function get()
> 4
> end
> end
> {:($(Expr(:lambda, {}, {{},{},{}}, :(begin
> return 4
> end))))}
> {:($(Expr(:lambda, {}, {{},{},{}}, :(begin
> return 4
> end))))}
> 4
> 4
As you can see, inside the expressions we have the values 2 and 4, but
inside the compiled functions we have the values 4 and 4.
I've never seen expressions disagreeing with their eval-ed form before. Is
this a bug? Or am I misunderstanding something about scope?
I tried using a let statement for "body = x * 2", but that did not change
anything.
Thanks,
Constantin