I am trying to make some nice inner constructors for an immutable that acts as a nice container. I've run into a bit of a problem with using the new constructor since I wish to have dynamic construction to avoid having to hardcode the hierarchy.
#apply new troubles immutable Vec3 x::Float64 y::Float64 z::Float64 end immutable Min_Discription postion::Array{Vec3} valid::Bool angry_butter_fly_quotient::Float64 end immutable Positive_Vec position::Array{Vec3} positive::BitArray valid::BitArray angry_butter_fly_quotient::Array{Float64} function Positive_Vec(elves::Array{Min_Discription}) size = length(elves) #automagically initialize all the data! defaults=((Type{Array{Vec3}},Vec3,null_pos), (Type{Array{Int}},Int, -1), (Type{BitArray},Bool,false), (Type{Array{Float64}},Float64, -Inf)) data_types = [fieldtype(Positive_Vec,x) for x in fieldnames( Positive_Vec)] declare_list = Array(Any,length(data_types)) for i in 1:length(data_types) for (d_type,primitive, default) in defaults if d_type == data_types[i] if d_type != Type{BitArray} declare_list[i] = Array(primitive, size) fill!(declare_list[i], default) else declare_list[i] = BitArray(size) fill!(declare_list[i], default) end end end end #defaults populated. Now overwrite data passed in for entry in fieldnames(Min_Discription) for (name,index) in enumerate(fieldnames(Positive_Vec)) if entry==name for (elf,i) in enumerate(elves) declare_list[index][i]=elf.(entry) end end end end #now we worry about a few special cases for (symbol, index) in enumerate(fieldnames(Positive_Vec)) name = string(symbol) if name=="positive" # set the size of the structure for i in 1:length(elves) declare_list[index][i] = elves[i].position.z>0.0 end end end return new(declare_list...)#apply(new, declare_list) end end a = Min_Discription(Vec3(0.0,0.0,0.0),true,73.27113) b = Min_Discription(Vec3(0.0,0.31,1.0),true,892.73165) c = Min_Discription(Vec3(0.8364,7.4,500.0),true,4.0) elves = Array(Min_Discription,3) elves[1],elves[2],elves[3]= a,b,c Positive_Vec(elves) julia> include("apply_new_troubles.jl") ERROR: LoadError: syntax: ... is not supported inside "new" in include at boot.jl:261 in include_from_node1 at loading.jl:304 trying to use apply(new, declare_list) doesn't work either. I'm being pointed towards making a an expression and doing some macro things over here: https://github.com/JuliaLang/julia/issues/13700#issuecomment-149861728 and the developers actually told me this was a use question so I'm here. In summary is there a good way to dynamically describe an inner constructor in julia? Presently, I'm thinking of something to emulate the missing splat functionality (whether it be interpolation or some @generated code), Or even moving the entire generation part into a macro, since all the dynamic parts are known at compile time (I simply wish to avoid a wall of hardcoded variables that will be difficult to maintain). Are there other avenues to follow? I would prefer to keep the functions attached to the constructor as this facilitates code clarity. Any assistance or advice would be appreciated.
apply_new_troubles.jl
Description: Binary data