I know, but would it be possible to generate code in module X, using g as a globally defined function so that the function g gets resolved based on the module where f is being used?
Ps: I don't want to pass g as a parameter to f. Here is an example: julia> module X export f g(x) = 2x f(x) = g(x) end X julia> module Y using X g(x) = 3x println(f(4)) end 8 *# this should have been 12 if the function g is used from Y, it hasn't been used because when we look at the AST, we would see it is making a call to the function g in module X.* Y julia> f.env.defs.func.code AST(:($(Expr(:lambda, Any[:x], Any[Any[Any[:x,:Any,0]],Any[],0,Any[]], :(begin # none, line 4: *return (X.g)(x) # here* end))))) So in the light of this, is it possible to generate code using a macro with some sort of a special AST node, which resolves the function based on the current scope the code.???? On Wednesday, February 17, 2016 at 1:24:33 PM UTC-8, Stefan Karpinski wrote: > > There is no g defined inside of module X. > > On Wed, Feb 17, 2016 at 3:19 PM, Julia Tylors <julia...@gmail.com > <javascript:>> wrote: > >> julia> module X >> export f >> function f(x) >> g(x) >> end >> end >> X >> >> julia> module Y >> using X >> g(x) = 2x >> f(4) >> end >> ERROR: UndefVarError: g not defined >> in f at ./none:4 >> >> I am trying to use another function g(x) which can be defined in any >> other module by calling function f. >> This is the idea at its simplest. But It seems it doesn't work. >> >> >> On Monday, February 15, 2016 at 7:03:54 PM UTC-8, Cedric St-Jean wrote: >>> >>> Hi Julia, what are you trying to achieve, concretely? >>> >>> On Monday, February 15, 2016 at 2:36:15 PM UTC-5, Julia Tylors wrote: >>>> >>>> I started to think, this may be normal working of julia. >>>> >>>> import X:_ex_func >>>> using X >>>> _ex_func() = println("DDD") >>>> _1ex_func() >>>> julia> _1ex_func() >>>> DDD >>>> sty >>>> >>>> julia> module Y >>>> using X >>>> _ >>>> _1ex_func __precompile__ _ex_func >>>> julia> module Y >>>> using X >>>> _1ex_func() >>>> end >>>> DDD >>>> sty >>>> Y >>>> >>>> However, it seems once a function is overridden, it stays overridden in >>>> every module. >>>> That is a very weird idea. why is there such a design decision? Can >>>> someone care to explain it? >>>> >>>> Thanks >>>> >>>> On Monday, February 15, 2016 at 11:04:07 AM UTC-8, Julia Tylors wrote: >>>>> >>>>> 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 (julia...@gmail.com >>>>>> (mailto:juliatyl...@gmail.com)) 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 >>>>>> >>>>> >