[julia-users] Re: Macro scoping (or hygiene?) problems

2014-12-31 Thread Tomas Lycken
Actually, I do know `d` at compile time - I just hadn't grok-ed quoting and 
interpolation well enough to understand how to convey that in code. As it 
turns out, what I needed was to create a *symbol* for `d`, so that the 
interpolation would get back its *value*: `$(matching(:d))` does the trick.

Thanks for kicking me in the right direction =)

// T


On Tuesday, December 30, 2014 10:09:01 PM UTC+1, Valentin Churavy wrote:

 So I do not totally understand the goal of what you are trying to achieve, 
 but could you try to do this with a macro?

 macro value(d)
 @show d
 quote
 println(d at runtime , $d)
 end
 end

 @ngenerate N T function example{T,N}(A::Array{T,N}, xs::NTuple{N,Real}...)
 @nexprs N dim-begin
 @nexprs N d-begin
 @value(d)
 end
 end
 end

 example(rand(2,2), 1.5, 0.7)

 So at least the value of d is know at the time when the macro value is run 
 and you could then call expression generating code based on that value. 

 dispatching on types of some additional arguments


 That sounds like you should/could use staged functions for that.  

 On Tuesday, 30 December 2014 17:59:37 UTC+1, Tomas Lycken wrote:

 I’m doing some metaprogramming for Interpolations.jl, and I’m getting 
 stuck at an error that I think is due to scoping issues in my nested 
 quotes, and I’ve stared at this for so long now I’m not getting anywhere.

 I can do the following

 matching(d) = quote
 println(Matching: , $d)
 end

 nonmatching(d) = quote
 println(Not matching: , $d)
 end

 @ngenerate N T function example{T,N}(A::Array{T,N}, xs::NTuple{N,Real}...)
 @nexprs N dim-begin
 @nexprs N d-begin
 if d==dim
 eval(matching(d))
 else
 eval(nonmatching(d))
 end
 end
 end
 end

 example(rand(2,2), 1.5, 0.7)

 and get the expected output:

 Matching: 1
 Not matching: 2
 Not matching: 1
 Matching: 2

 Examining with macroexpand, I see that the eval calls are still there, 
 but for performance reasons I want to avoid them, so I try to rewrite it to 
 use eval(ngenerate(...)) instead of @ngenerate ...:

 #matching and nonmatching defined as before

 ex = ngenerate(
 :N,
 :T,
 :(example{T,N}(A::Array{T,N}, xs::NTuple{N,Real}...)),
 N-quote
 @nexprs $N dim-begin
 @nexprs $N d-begin
 if d==dim
 $(matching(d))
 else
 $(notmatching(d))
 end
 end
 end
 end
 )

 eval(ex)

 example(rand(2,2), 1.5, 0.7)

 But this doesn’t work: I get ERROR: d not defined on $(matching(d)) 
 (and, if I comment that one out, $(nonmatching(d))). I’ve tried 
 $(matching($d)) (ERROR: error compiling anonymous: syntax: prefix $ in 
 non-quoted expression) as well as $(matching(esc(d))) and 
 $(esc(matching(d))) (both ERROR: d not defined), and I’m at a loss for 
 what to try (these errors are all thrown at the stage of *defining* the 
 quoted expression, so macroexpand hasn’t helped me here either, as I 
 don’t get any expression to call it on…).

 Eventually, this will be used to do different things for different array 
 dimensions like here, but with both matching and nonmatching also 
 dispatching on types of some additional arguments that I left out for 
 simplicity, and choosing expressions by means of multiple dispatch this way 
 is really at the core of Interpolations.jl, so I can’t move the contents of 
 matching and nonmatching out of their respective functions.

 Thanks in advance for any ideas that get me forward,

 // Tomas
 ​



[julia-users] Re: Macro scoping (or hygiene?) problems

2014-12-31 Thread Valentin Churavy
Glad to be of help :)

On Wednesday, 31 December 2014 10:15:14 UTC+1, Tomas Lycken wrote:

 Actually, I do know `d` at compile time - I just hadn't grok-ed quoting 
 and interpolation well enough to understand how to convey that in code. As 
 it turns out, what I needed was to create a *symbol* for `d`, so that the 
 interpolation would get back its *value*: `$(matching(:d))` does the trick.

 Thanks for kicking me in the right direction =)

 // T
 

 On Tuesday, December 30, 2014 10:09:01 PM UTC+1, Valentin Churavy wrote:

 So I do not totally understand the goal of what you are trying to 
 achieve, but could you try to do this with a macro?

 macro value(d)
 @show d
 quote
 println(d at runtime , $d)
 end
 end

 @ngenerate N T function example{T,N}(A::Array{T,N}, xs::NTuple{N,Real}...)
 @nexprs N dim-begin
 @nexprs N d-begin
 @value(d)
 end
 end
 end

 example(rand(2,2), 1.5, 0.7)

 So at least the value of d is know at the time when the macro value is 
 run and you could then call expression generating code based on that value. 

 dispatching on types of some additional arguments


 That sounds like you should/could use staged functions for that.  

 On Tuesday, 30 December 2014 17:59:37 UTC+1, Tomas Lycken wrote:

 I’m doing some metaprogramming for Interpolations.jl, and I’m getting 
 stuck at an error that I think is due to scoping issues in my nested 
 quotes, and I’ve stared at this for so long now I’m not getting anywhere.

 I can do the following

 matching(d) = quote
 println(Matching: , $d)
 end

 nonmatching(d) = quote
 println(Not matching: , $d)
 end

 @ngenerate N T function example{T,N}(A::Array{T,N}, xs::NTuple{N,Real}...)
 @nexprs N dim-begin
 @nexprs N d-begin
 if d==dim
 eval(matching(d))
 else
 eval(nonmatching(d))
 end
 end
 end
 end

 example(rand(2,2), 1.5, 0.7)

 and get the expected output:

 Matching: 1
 Not matching: 2
 Not matching: 1
 Matching: 2

 Examining with macroexpand, I see that the eval calls are still there, 
 but for performance reasons I want to avoid them, so I try to rewrite it to 
 use eval(ngenerate(...)) instead of @ngenerate ...:

 #matching and nonmatching defined as before

 ex = ngenerate(
 :N,
 :T,
 :(example{T,N}(A::Array{T,N}, xs::NTuple{N,Real}...)),
 N-quote
 @nexprs $N dim-begin
 @nexprs $N d-begin
 if d==dim
 $(matching(d))
 else
 $(notmatching(d))
 end
 end
 end
 end
 )

 eval(ex)

 example(rand(2,2), 1.5, 0.7)

 But this doesn’t work: I get ERROR: d not defined on $(matching(d)) 
 (and, if I comment that one out, $(nonmatching(d))). I’ve tried 
 $(matching($d)) (ERROR: error compiling anonymous: syntax: prefix $ in 
 non-quoted expression) as well as $(matching(esc(d))) and 
 $(esc(matching(d))) (both ERROR: d not defined), and I’m at a loss for 
 what to try (these errors are all thrown at the stage of *defining* the 
 quoted expression, so macroexpand hasn’t helped me here either, as I 
 don’t get any expression to call it on…).

 Eventually, this will be used to do different things for different array 
 dimensions like here, but with both matching and nonmatching also 
 dispatching on types of some additional arguments that I left out for 
 simplicity, and choosing expressions by means of multiple dispatch this way 
 is really at the core of Interpolations.jl, so I can’t move the contents of 
 matching and nonmatching out of their respective functions.

 Thanks in advance for any ideas that get me forward,

 // Tomas
 ​



[julia-users] Re: Macro scoping (or hygiene?) problems

2014-12-30 Thread Valentin Churavy
So I do not totally understand the goal of what you are trying to achieve, 
but could you try to do this with a macro?

macro value(d)
@show d
quote
println(d at runtime , $d)
end
end

@ngenerate N T function example{T,N}(A::Array{T,N}, xs::NTuple{N,Real}...)
@nexprs N dim-begin
@nexprs N d-begin
@value(d)
end
end
end

example(rand(2,2), 1.5, 0.7)

So at least the value of d is know at the time when the macro value is run 
and you could then call expression generating code based on that value. 

dispatching on types of some additional arguments


That sounds like you should/could use staged functions for that.  

On Tuesday, 30 December 2014 17:59:37 UTC+1, Tomas Lycken wrote:

 I’m doing some metaprogramming for Interpolations.jl, and I’m getting 
 stuck at an error that I think is due to scoping issues in my nested 
 quotes, and I’ve stared at this for so long now I’m not getting anywhere.

 I can do the following

 matching(d) = quote
 println(Matching: , $d)
 end

 nonmatching(d) = quote
 println(Not matching: , $d)
 end

 @ngenerate N T function example{T,N}(A::Array{T,N}, xs::NTuple{N,Real}...)
 @nexprs N dim-begin
 @nexprs N d-begin
 if d==dim
 eval(matching(d))
 else
 eval(nonmatching(d))
 end
 end
 end
 end

 example(rand(2,2), 1.5, 0.7)

 and get the expected output:

 Matching: 1
 Not matching: 2
 Not matching: 1
 Matching: 2

 Examining with macroexpand, I see that the eval calls are still there, 
 but for performance reasons I want to avoid them, so I try to rewrite it to 
 use eval(ngenerate(...)) instead of @ngenerate ...:

 #matching and nonmatching defined as before

 ex = ngenerate(
 :N,
 :T,
 :(example{T,N}(A::Array{T,N}, xs::NTuple{N,Real}...)),
 N-quote
 @nexprs $N dim-begin
 @nexprs $N d-begin
 if d==dim
 $(matching(d))
 else
 $(notmatching(d))
 end
 end
 end
 end
 )

 eval(ex)

 example(rand(2,2), 1.5, 0.7)

 But this doesn’t work: I get ERROR: d not defined on $(matching(d)) (and, 
 if I comment that one out, $(nonmatching(d))). I’ve tried $(matching($d)) 
 (ERROR: error compiling anonymous: syntax: prefix $ in non-quoted 
 expression) as well as $(matching(esc(d))) and $(esc(matching(d))) (both 
 ERROR: 
 d not defined), and I’m at a loss for what to try (these errors are all 
 thrown at the stage of *defining* the quoted expression, so macroexpand 
 hasn’t helped me here either, as I don’t get any expression to call it on…).

 Eventually, this will be used to do different things for different array 
 dimensions like here, but with both matching and nonmatching also 
 dispatching on types of some additional arguments that I left out for 
 simplicity, and choosing expressions by means of multiple dispatch this way 
 is really at the core of Interpolations.jl, so I can’t move the contents of 
 matching and nonmatching out of their respective functions.

 Thanks in advance for any ideas that get me forward,

 // Tomas
 ​