@@ -48,70 +48,38 @@ function connector_macro(mod, name, body)
48
48
end
49
49
50
50
function parse_variable_def! (dict, mod, arg, varclass)
51
+ arg isa LineNumberNode && return
51
52
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 )
54
55
Expr (:(= ), a, b) => begin
55
- var = parse_variable_def! (dict, mod, a, varclass)
56
+ var, _ = parse_variable_def! (dict, mod, a, varclass)
56
57
def, meta = parse_default (mod, b)
57
58
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
59
63
if ! isnothing (meta)
60
64
if (ct = get (meta, VariableConnectType, nothing )) != = nothing
61
65
dict[varclass][getname (var)][:connection_type ] = nameof (ct)
62
66
end
63
67
var = set_var_metadata (var, meta)
64
68
end
65
- var
69
+ ( var, def)
66
70
end
67
71
Expr (:tuple , a, b) => begin
68
- var = parse_variable_def! (dict, mod, a, varclass)
72
+ var, _ = parse_variable_def! (dict, mod, a, varclass)
69
73
meta = parse_metadata (mod, b)
70
74
if (ct = get (meta, VariableConnectType, nothing )) != = nothing
71
75
dict[varclass][getname (var)][:connection_type ] = nameof (ct)
72
76
end
73
- set_var_metadata (var, meta)
77
+ ( set_var_metadata (var, meta), nothing )
74
78
end
75
79
_ => error (" $arg cannot be parsed" )
76
80
end
77
81
end
78
82
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
-
115
83
function generate_var (a, varclass)
116
84
var = Symbolics. variable (a)
117
85
if varclass == :parameters
@@ -155,8 +123,7 @@ function parse_default(mod, a)
155
123
meta = parse_metadata (mod, y)
156
124
(def, meta)
157
125
end
158
- :: Symbol => (get_var (mod, a), nothing )
159
- :: Number => (a, nothing )
126
+ :: Symbol || :: Number => (a, nothing )
160
127
_ => error (" Cannot parse default $a " )
161
128
end
162
129
end
@@ -208,14 +175,12 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
208
175
icon = Ref {Union{String, URI}} ()
209
176
vs = []
210
177
ps = []
211
- parexpr = :(pss = @parameters begin end )
212
- varexpr = :(vss = @variables begin end )
213
178
214
179
for arg in expr. args
215
180
arg isa LineNumberNode && continue
216
181
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)
219
184
elseif arg. head == :block
220
185
push! (exprs. args, arg)
221
186
else
@@ -227,13 +192,10 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
227
192
iv = dict[:independent_variable ] = variable (:t )
228
193
end
229
194
230
- push! (exprs. args, varexpr)
231
- push! (exprs. args, parexpr)
232
-
233
195
gui_metadata = isassigned (icon) > 0 ? GUIMetadata (GlobalRef (mod, name), icon[]) :
234
196
nothing
235
197
236
- sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, [$ (vs... ), vss ... ], [$ (ps... ), pss ... ];
198
+ sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, [$ (vs... )], [$ (ps... )];
237
199
systems = [$ (comps... )], name, gui_metadata = $ gui_metadata))
238
200
if ext[] === nothing
239
201
push! (exprs. args, sys)
@@ -244,7 +206,7 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
244
206
:($ name = $ Model (($ (arglist... ); name, $ (kwargs... )) -> $ exprs, $ dict))
245
207
end
246
208
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,
248
210
mod, arg, kwargs)
249
211
mname = arg. args[1 ]
250
212
body = arg. args[end ]
@@ -253,9 +215,9 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, di
253
215
elseif mname == Symbol (" @extend" )
254
216
parse_extend! (exprs, ext, dict, body)
255
217
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 )
257
219
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 )
259
221
elseif mname == Symbol (" @equations" )
260
222
parse_equations! (exprs, eqs, dict, body)
261
223
elseif mname == Symbol (" @icon" )
@@ -357,15 +319,21 @@ function parse_extend!(exprs, ext, dict, body)
357
319
end
358
320
end
359
321
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)
365
324
v = Num (vv)
366
325
name = getname (v)
367
326
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
369
337
end
370
338
371
339
function parse_equations! (exprs, eqs, dict, body)
0 commit comments