I'm not sure if it would help your case, but I did something similar for a much simpler case. The result is kind of hideous but it works. I wanted to expose a function called "debug" from the "Lumberjack.jl" logging package as a macro, so function arguments would not be evaluated when the current loglevel was less verbose. I'm sure there is a less hideous way to do this, but this is what ended up working after trial and error:
using Lumberjack # defines the "debug" function, among others macro debug(msg) :(esc(debug(string($(esc(msg)))))) end So inside the macro, "debug" resolves to a function defined in the scope of this file (through the "using Lumberjack" statement). Other files that import this one do not import Lumberjack, yet this macro works, which is why I think it might be similar to your case. On Friday, June 13, 2014 1:45:52 PM UTC-4, Andrew McKinlay wrote: > > Is it possible to quote code where the methods are already resolved? For > example, instead of `+` being a symbol in the quoted code, it would be > resolved to the + operator from the current module? > > On Friday, May 23, 2014 8:31:19 PM UTC-4, Isaiah wrote: >> >> parse("...codez...") can be helpful too. >> >> For (1) & (2), the single-quoted numbers are interpreted as literals >> rather than symbols. It is possible to create a Symbol called `:1` with >> `symbol("1")`, if needed, but that seems strange. The entry syntax `:1` >> might be disallowed for efficiency and disambiguation - I'm not sure. >> >> For (3), in general, a TopNode tells the compiler to resolve any names to >> the current base module. It might be illustrative to look at the difference >> between these expressions: >> >> julia> a = 1 >> 1 >> >> julia> :($a + 1) >> :(1 + 1) >> >> julia> :(1+:(a+2)) >> :(1 + :(a + 2)) >> >> julia> :(1+:($a+2)) >> :(1 + top(Expr)(:call,:+,a,2)) >> >> The last case asks for an interpolation which cannot be expanded at parse >> time, because the interpolation is quoted. The `top(Expr)` and `call` are >> generated to guarantee that `foo` - whatever the value of `foo` ends up as >> in the Top module namespace - is used when the expression is evaluated. >> >> (as an aside, eval'ing those last two examples will give errors, >> because it is not possible to add an Int and an Expr) >> >> >> >> >> >> On Fri, May 23, 2014 at 3:53 PM, Adam Smith <swiss.arm...@gmail.com> >> wrote: >> >>> I find it quite helpful to use dump() on expressions to see the first >>> few levels of the parsed AST. That makes it easier to see what Julia is >>> doing with your expressions. >>> >>> >>> On Thursday, May 22, 2014 5:17:13 PM UTC-4, Andrew McKinlay wrote: >>>> >>>> I have been trying to grok Julia macros, so I've dived into the >>>> metaprogramming docs. Whilst playing around with the interpreter, I've run >>>> into some peculiarities that I don't quite understand. >>>> >>>> julia> versioninfo() >>>> Julia Version 0.3.0-prerelease+2690 >>>> Commit e4c2f68* (2014-04-20 12:15 UTC) >>>> ... >>>> >>>> >>>> 1. Why is typeof( :(:(1+2)) ) == Expr, but typeof( :(:(1)) ) == >>>> QuoteNode? >>>> 2. Why is typeof( :(1) ) == Int64, but again typeof( :(:(1)) ) == >>>> QuoteNode? >>>> 3. Why is typeof( :(1+:($1+2)).args[3].args[1] ) == TopNode? >>>> >>>> >>>> I was assuming that quoting was just a shorthand way for constructing >>>> expressions, since the docs say: >>>> >>>>> There is special syntax for “quoting” code (analogous to quoting >>>>> strings) that makes it easy to create expression objects without >>>>> explicitly >>>>> constructing Expr objects. >>>> >>>> But the types of objects constructed by quoting do not always take the >>>> form of an Expr, as above. >>>> >>>> What is going on here? >>>> >>> >>