Guys, this is no solution to my problem, escaping basically tells the the quoted expr to be resolved outside the macro as Lutfullah did. However in my case, escaping a function call doesn't work for some reason. And for that matter, esc should be recursive though...
On Monday, February 15, 2016 at 6:44:58 AM UTC-8, Joshua Ballanco wrote: > > On February 14, 2016 at 21:49:30, Julia Tylors ([email protected] > <javascript:>(mailto:[email protected] <javascript:>)) wrote: > > > Hi fellows, > > > > > > I was coding a macro, and I am having a prefix issue with functions. > > > > basically the problem is: Every single one of available functions > (_ex_func) which i want to be globally accessible are prefixed with the > name of the module(X) in which the macro f is defined > > > > > > Here is the code example: > > > > julia> module X > > export @f > > macro f(x) > > st = string("_",x) > > sy = symbol(st) > > esc(quote > > function ($sy)() > > println("st") > > end > > > > function ($(symbol(string("_1",x))))() > > ($sy)() > > println("sty") > > end > > export $sy > > export $(symbol(string("_1",x))) > > end > > ) > > end > > @eval @f ex_func > > end > > X > > > > julia> using X > > > > julia> _ > > > > _1ex_func __precompile__ _ex_func > > julia> _1ex_func.env.defs.func.code > > AST(:($(Expr(:lambda, Any[], Any[Any[],Any[],0,Any[]], :(begin # none, > line 12: > > (X._ex_func)() # none, line 13: # i want this to be not prefixed by X > > return (X.println)("sty") > > end))))) > > > > julia> macroexpand(:(@f ex_func)) > > quote # none, line 7: > > function _ex_func() # none, line 8: > > println("st") > > end # none, line 11: > > function _1ex_func() # none, line 12: > > _ex_func() # none, line 13: # it seems OK, here!!! > > println("sty") > > end # none, line 15: > > export _ex_func # none, line 16: > > export _1ex_func > > end > > > > > > > > as you may see , I may well define _ex_func in other modules and use it > from the function X._1ex_func(). > > But this prevents me doing it. > > > > How can i solve this problem? > > > > Thanks > > OH! I know this! > > Actually, I do believe this is a bug in macro hygiene and have been > meaning to file it. In the mean time, double-escaping should work for you: > > julia> module X > macro p(y) > quote > println($y) > end > end > macro q(y) > quote > println(:($($y))) > end > end > end > X > > julia> using X > > julia> test = "Hello, world" > "Hello, world" > > julia> @X.p(test) > ERROR: UndefVarError: test not defined > > julia> @X.q(test) > Hello, world >
