There is no g defined inside of module X.

On Wed, Feb 17, 2016 at 3:19 PM, Julia Tylors <[email protected]> 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 ([email protected]
>>>>> (mailto:[email protected])) 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
>>>>>
>>>>

Reply via email to