Consider two functions, function Y and function Z. The parameter values of these functions are stored in two different structures, ParametersY and ParametersZ. Suppose the functions are nested, where Z uses Y. Then it seems logical to nest the structures as well, where ParametersY is included as a field in ParametersZ. Suppose the structures ParametersY and ParametersZ are defined in two separate modules.
The first module is:
module ModuleY struct ParametersY a::Int64 end export ParametersY end
The second module is:
module ModuleZ include(“ModuleY.jl”) using .ModuleY struct ParametersZ parent::ParametersY b::Int64 end export ParametersZ end
If you then do the following:
include(“ModuleY.jl”) using .ModuleY include(“ModuleZ.jl”) using .ModuleZ parsY = ParametersY(5) parsZ = ParametersZ(parsY,3)
you get the following error message:
ERROR: MethodError: Cannot `convert` an object of type ParametersY to an object of type Main.ModuleZ.ModuleY.ParametersY
This can be solved by adding ParametersY to the export of ModuleZ, and then defining parsY and parsZ as follows:
parsY = ModuleY.ParametersY(5) parsZ = ParametersZ(ModuleZ.ParametersY(5),3)
But with complex code, with several functions that are nested in each other, this may easily become very cumbersome. Isn’t there an easier way to go ahead? The ultimate goal is to get a library of functions that may refer to other functions and structures to store their parameter values (some of which may therefore be used by other functions if functions are nested).