You can still use meta-programming to generate the code function removeLine(poly, index) for op = (:a, :b, :x1, :y1, :x2, :y2, :typ) @eval splice!($poly.$op, $index) end end
On Thursday, May 8, 2014 5:40:35 PM UTC+3, Stéphane Laurent wrote: > > Thank you Johan and Jameson. > > Johan, I don't know how to make a loop on the fields with a function. For > example this doesn't work: > > function removeLine(poly::Poly, index::Int) > > for op = (:a, :b, :x1, :y1, :x2, :y2, :typ) > > splice!(poly.$op, index) > > end > > end > > > How to do, please ? > > > Le jeudi 8 mai 2014 15:59:06 UTC+2, Jameson a écrit : >> >> Replace your macro with a function and delete the uses of eval. You code >> will be faster, and easier to understand. Most of the difficulty people >> seem to have with macros comes from thinking they are a type of function >> call -- the @ character is supposed to remind you that this is not true. >> >> On Thursday, May 8, 2014, Johan Sigfrids <johan.s...@gmail.com> wrote: >> >>> I myself have been hitting my head against the wall that is >>> meta-programming in Julia. I think I can answer your first question at >>> least. >>> >>> Q1: This is because the line poly = emptyPoly doesn't create a new copy >>> of a ploygon but a reference to the empty one so that both poly and >>> emptyPoly >>> refer to the same data. You need to do poly = deepcopy(emptyPoly) . >>> >>> On Thursday, May 8, 2014 9:56:27 AM UTC+3, Stéphane Laurent wrote: >>> >>> Hello everybody, >>> >>> Below I define two new types : Line and Poly. The Poly type is intended >>> for stacking some lines. >>> >>> type Line >>> >>> a::Float64 # intercept >>> >>> b::BigFloat # slope >>> >>> x1::BigFloat # x-coordinate of first vertex >>> >>> y1::BigFloat # y-coordinate of first vertex >>> >>> x2::BigFloat # x-coordinate of second vertex >>> >>> y2::BigFloat # y-coordinate of second vertex >>> >>> typ::Bool # type of the line (true:upper, false:lower) >>> >>> end >>> >>> >>> type Poly >>> >>> a::Vector{Float64} >>> >>> b::Vector{BigFloat} >>> >>> x1::Vector{BigFloat} >>> >>> y1::Vector{BigFloat} >>> >>> x2::Vector{BigFloat} >>> >>> y2::Vector{BigFloat} >>> >>> typ::Vector{Bool} >>> >>> end >>> >>> >>> >>> I also define the empty Poly: >>> >>> emptyPoly = Poly(Array(Float64,0), Array >>> >>>