@@ -48,70 +48,38 @@ function connector_macro(mod, name, body)
4848end
4949
5050function parse_variable_def! (dict, mod, arg, varclass)
51+ arg isa LineNumberNode && return
5152 MLStyle. @match arg begin
52- :: Symbol => generate_var! (dict, arg, varclass)
53- Expr (:call , a, b) => generate_var! (dict, a, b, varclass)
53+ :: Symbol => ( generate_var! (dict, arg, varclass), nothing )
54+ Expr (:call , a, b) => ( generate_var! (dict, a, b, varclass), nothing )
5455 Expr (:(= ), a, b) => begin
55- var = parse_variable_def! (dict, mod, a, varclass)
56+ var, _ = parse_variable_def! (dict, mod, a, varclass)
5657 def, meta = parse_default (mod, b)
5758 dict[varclass][getname (var)][:default ] = def
58- var = setdefault (var, def)
59+ if typeof (def) != Symbol
60+ var = setdefault (var, def)
61+ def = nothing
62+ end
5963 if ! isnothing (meta)
6064 if (ct = get (meta, VariableConnectType, nothing )) != = nothing
6165 dict[varclass][getname (var)][:connection_type ] = nameof (ct)
6266 end
6367 var = set_var_metadata (var, meta)
6468 end
65- var
69+ ( var, def)
6670 end
6771 Expr (:tuple , a, b) => begin
68- var = parse_variable_def! (dict, mod, a, varclass)
72+ var, _ = parse_variable_def! (dict, mod, a, varclass)
6973 meta = parse_metadata (mod, b)
7074 if (ct = get (meta, VariableConnectType, nothing )) != = nothing
7175 dict[varclass][getname (var)][:connection_type ] = nameof (ct)
7276 end
73- set_var_metadata (var, meta)
77+ ( set_var_metadata (var, meta), nothing )
7478 end
7579 _ => error (" $arg cannot be parsed" )
7680 end
7781end
7882
79- function parse_variables_with_kw! (exprs, var, dict, mod, body, varexpr, varclass, kwargs)
80- for arg in body. args
81- arg isa LineNumberNode && continue
82- MLStyle. @match arg begin
83- :: Symbol || Expr (:tuple , a, b) || Expr (:call , a, b) || Expr (:(= ), a, b:: Number ) => begin
84- parse_variables! (exprs, var, dict, mod, arg, varclass)
85- end
86- Expr (:(= ), a, b:: Symbol ) => begin
87- isdefined (mod, b) ?
88- parse_variables! (exprs, var, dict, mod, arg, varclass) :
89- push! (varexpr. args[end ]. args[end ]. args, arg)
90- end
91- Expr (:(= ), a, b) => begin
92- def = Base. remove_linenums! (b)
93- MLStyle. @match def begin
94- Expr (:tuple , x:: Symbol , y) => begin
95- isdefined (mod, x) ?
96- parse_variables! (exprs, var, dict, mod, arg, varclass) :
97- push! (varexpr. args[end ]. args[end ]. args, arg)
98- end
99- :: Symbol => push! (varexpr. args[end ]. args[end ]. args,
100- :($ a = $ (def. args[end ])))
101- :: Number || Expr (:tuple , x:: Number , y) => begin
102- parse_variables! (exprs, var, dict, mod, arg, varclass)
103- end
104- :: Expr => push! (varexpr. args[end ]. args[end ]. args,
105- :($ a = $ (def. args[end ])))
106- _ => error (" Got $def " )
107- end
108- end
109- _ => error (" Could not parse this $varclass definition $arg " )
110- end
111- end
112- dict[:kwargs ] = kwargs
113- end
114-
11583function generate_var (a, varclass)
11684 var = Symbolics. variable (a)
11785 if varclass == :parameters
@@ -155,8 +123,7 @@ function parse_default(mod, a)
155123 meta = parse_metadata (mod, y)
156124 (def, meta)
157125 end
158- :: Symbol => (get_var (mod, a), nothing )
159- :: Number => (a, nothing )
126+ :: Symbol || :: Number => (a, nothing )
160127 _ => error (" Cannot parse default $a " )
161128 end
162129end
@@ -208,14 +175,12 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
208175 icon = Ref {Union{String, URI}} ()
209176 vs = []
210177 ps = []
211- parexpr = :(pss = @parameters begin end )
212- varexpr = :(vss = @variables begin end )
213178
214179 for arg in expr. args
215180 arg isa LineNumberNode && continue
216181 if arg. head == :macrocall
217- parse_model! (exprs. args, comps, ext, eqs, icon, vs, varexpr, ps,
218- parexpr, dict, mod, arg, kwargs)
182+ parse_model! (exprs. args, comps, ext, eqs, icon, vs, ps,
183+ dict, mod, arg, kwargs)
219184 elseif arg. head == :block
220185 push! (exprs. args, arg)
221186 else
@@ -227,13 +192,10 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
227192 iv = dict[:independent_variable ] = variable (:t )
228193 end
229194
230- push! (exprs. args, varexpr)
231- push! (exprs. args, parexpr)
232-
233195 gui_metadata = isassigned (icon) > 0 ? GUIMetadata (GlobalRef (mod, name), icon[]) :
234196 nothing
235197
236- sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, [$ (vs... ), vss ... ], [$ (ps... ), pss ... ];
198+ sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, [$ (vs... )], [$ (ps... )];
237199 systems = [$ (comps... )], name, gui_metadata = $ gui_metadata))
238200 if ext[] === nothing
239201 push! (exprs. args, sys)
@@ -244,7 +206,7 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
244206 :($ name = $ Model (($ (arglist... ); name, $ (kwargs... )) -> $ exprs, $ dict))
245207end
246208
247- function parse_model! (exprs, comps, ext, eqs, icon, vs, varexpr, ps, parexpr , dict,
209+ function parse_model! (exprs, comps, ext, eqs, icon, vs, ps , dict,
248210 mod, arg, kwargs)
249211 mname = arg. args[1 ]
250212 body = arg. args[end ]
@@ -253,9 +215,9 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, di
253215 elseif mname == Symbol (" @extend" )
254216 parse_extend! (exprs, ext, dict, body)
255217 elseif mname == Symbol (" @variables" )
256- parse_variables_with_kw ! (exprs, vs, dict, mod, body, varexpr, :variables , kwargs )
218+ parse_variables ! (exprs, vs, dict, mod, body, :variables )
257219 elseif mname == Symbol (" @parameters" )
258- parse_variables_with_kw ! (exprs, ps, dict, mod, body, parexpr, :parameters , kwargs )
220+ parse_variables ! (exprs, ps, dict, mod, body, :parameters )
259221 elseif mname == Symbol (" @equations" )
260222 parse_equations! (exprs, eqs, dict, body)
261223 elseif mname == Symbol (" @icon" )
@@ -357,15 +319,21 @@ function parse_extend!(exprs, ext, dict, body)
357319 end
358320end
359321
360- function parse_variables! (exprs, vs, dict, mod, arg, varclass)
361- expr = Expr (:block )
362- push! (exprs, expr)
363- arg isa LineNumberNode && return
364- vv = parse_variable_def! (dict, mod, arg, varclass)
322+ function parse_variable_arg! (expr, vs, dict, mod, arg, varclass)
323+ vv, def = parse_variable_def! (dict, mod, arg, varclass)
365324 v = Num (vv)
366325 name = getname (v)
367326 push! (vs, name)
368- push! (expr. args, :($ name = $ v))
327+ def === nothing ? push! (expr. args, :($ name = $ v)) : push! (expr. args, :($ name = $ setdefault ($ v, $ def)))
328+ end
329+
330+ function parse_variables! (exprs, vs, dict, mod, body, varclass)
331+ expr = Expr (:block )
332+ push! (exprs, expr)
333+ for arg in body. args
334+ arg isa LineNumberNode && continue
335+ parse_variable_arg! (expr, vs, dict, mod, arg, varclass)
336+ end
369337end
370338
371339function parse_equations! (exprs, eqs, dict, body)
0 commit comments