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
>>
>