quote...end is effectively the same as :(being ... end), that's all. I think you probably want something more like
macro nb(f, args...) :($f($(args...))) |> esc end since the function `f` should also be resolved at the call site. On 15 January 2015 at 03:39, yi lu <[email protected]> wrote: > I don't know why my previous version won't work,BUT > > ``` > macro nb(f, args...) > :($f($(arg...))) > end > ``` > > > will get the right result. What's the difference between `quote .. end` > and `:( .. )` then? > > > :P > > On Thu, Jan 15, 2015 at 11:06 AM, Isaiah Norton <[email protected]> > wrote: > >> julia> macro nb(f, args...) >> arg1 = map(x->:($(esc(x))), args) >> :($f($(arg1...))) >> end >> >> julia> @nb print arr >> [0.0,0.020100000000000007, ... >> >> If you haven't used it already, I would suggest to look at macroexpand to >> see the expression resulting from each macro (for example, look at why the >> previous version didn't work). >> >> julia> macroexpand( :(@nb print arr) ) >> >> On Wed, Jan 14, 2015 at 8:32 PM, yi lu <[email protected]> >> wrote: >> >>> Well, I don't get it very clearly. I learnt that 'esc' changes variable >>> names of a local variable in the macro. But I want to reference the global >>> variable out of the macro. I have little idea of Lisp macros, so I think I >>> still cannot handle this. >>> Would you please add more details? >>> >>> Yi >>> >>> On Wed, Jan 14, 2015 at 11:37 PM, Isaiah Norton <[email protected] >>> > wrote: >>> >>>> You need to use 'esc' -- see the hygiene part of the metaprog section >>>> in the manual. >>>> On Jan 14, 2015 8:56 AM, "yi lu" <[email protected]> wrote: >>>> >>>>> Hi, >>>>> >>>>> I am able to write a simple macro to drop brackets. >>>>> https://gist.github.com/eccstartup/36637d96355bd5ca8188 >>>>> >>>>> But there is some problem with this. >>>>> >>>>> You can see the @nobrace macro that drop brackets of functions. >>>>> For example: >>>>> ``` >>>>> @nobrace map (x->x^2-1) 1:0.01:2 >>>>> ``` >>>>> get a list of Float numbers. This is fine. >>>>> >>>>> However, in the macro, we cannot see global variables. >>>>> For example: >>>>> ``` >>>>> arr = @nobrace map (x->x^2-1) 1:0.01:2 >>>>> print(arr) >>>>> ``` >>>>> will print the "arr" list, but >>>>> ``` >>>>> arr = @nobrace map (x->x^2-1) 1:0.01:2 >>>>> @nobrace print arr >>>>> ``` >>>>> will report "arr not found". >>>>> >>>>> Is there a remedy? >>>>> >>>>> >>>>> Yours, >>>>> Yi >>>>> >>>> >>> >> >
