> > but in my case, the function f is very huge and i don't want to generate > it all the time. >
Why do you want to have the same function generated in every module? On Wed, Feb 17, 2016 at 5:20 PM, Julia Tylors <juliatyl...@gmail.com> wrote: > basically you generate the code every time in the module of interest. but > in my case, the function f is very huge and i don't want to generate it all > the time. > so that is not what i want to do either. I have seen that already. That is > why i was asking "is there some sort of a special AST node, which resolves > the function based on the current scope the code.????" > > that would be a lot more helpful. > Thanks > > > On Wednesday, February 17, 2016 at 2:12:31 PM UTC-8, Stefan Karpinski > wrote: >> >> module X >> export @make_f >> macro make_f() >> :($(esc(:f))(x) = $(esc(:g))(x)) >> end >> end >> >> module Y >> using X >> g(x) = 3x >> @make_f >> end >> >> julia> Y.f(2) >> 6 >> >> On Wed, Feb 17, 2016 at 5:01 PM, Julia Tylors <julia...@gmail.com> wrote: >> >>> Yes, exactly. >>> >>> >>> On Wednesday, February 17, 2016 at 1:53:57 PM UTC-8, Stefan Karpinski >>> wrote: >>>> >>>> So you want to have a macro that defines f for you in Y such that it >>>> calls Y's g? >>>> >>>> On Wed, Feb 17, 2016 at 4:48 PM, Julia Tylors <julia...@gmail.com> >>>> wrote: >>>> >>>>> 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> >>>>>> 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 >>>>>>>>>>> >>>>>>>>>> >>>>>> >>>> >>