Ok. any suggestions how to get close to the C preprocessor behaviour though?
On Monday, 24 October 2016 11:13:18 UTC+2, Mauro wrote: > > On Mon, 2016-10-24 at 10:37, Florian Oswald <florian...@gmail.com > <javascript:>> wrote: > > I have something that this in C++ I would write like > > > > double f(double x){ > > // do something with x > > #ifdef MACROVAR > > // do something else with x > > #endif > > return(x) > > } > > > > I was trying to understand how i could use julia macro's to achieve > > something similar. I have seen how the Logging.jl uses macros to this > end, > > at least that's how I understand > > it: > https://github.com/kmsquire/Logging.jl/blob/master/src/logging_macros.jl > > . However I'm a bit unclear as to how to use this in my case. in my > case, > > the condition of whether or not to insert a piece of code is stored in a > > custom type. Here is what I tried: > > > > # simplified type: > > type Param > > nD_rent :: Int > > end > > > > # macro: > > macro add_buy(p::Param) > > quote > > if $(esc(p.nD_rent)) > 4 > > # insert some additional code > > println("here comes additional code") > > println(typeof(p)) > > > > else > > println(typeof(p)) > > :nothing > > end > > end > > end > > No, a macro receives the AST. Check this > > macro tmp(p) > println(p) > println(typeof(p)) > end > > So your signature should probably just read: > > macro add_buy(p) > ... > end > > > *julia> **bk.@add_buy(p)* > > > > *ERROR: MethodError: no method matching @add_buy(::Symbol)* > > > > Closest candidates are: > > > > @add_buy(*::bk.Param*) at > > /Users/florian.oswald/git/bk/bk.jl/src/solver.jl:641 > > > > > > so, I have a type `Param`, and depending on the value in field nD_rent, > I > > would like to insert that code or not. thanks for any suggestions. > > That is not what your above macro does. And that is not what macros > should do (ideally), they should be syntax transformations independent > of the values. You can eval in a macro but that is *strongly* > discouraged. >