@@ -24,6 +24,7 @@ function connector_macro(mod, name, body)
24
24
vs = Num[]
25
25
icon = Ref {Union{String, URI}} ()
26
26
dict = Dict {Symbol, Any} ()
27
+ kwargs = []
27
28
for arg in body. args
28
29
arg isa LineNumberNode && continue
29
30
if arg. head == :macrocall && arg. args[1 ] == Symbol (" @icon" )
@@ -70,38 +71,32 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs)
70
71
end
71
72
end
72
73
73
- function for_keyword_queue ()
74
- # These args contain potential keywords
75
- # Handle it along with vars without defaults
76
- end
77
-
78
- # Takes in args and populates kw and var definition exprs.
79
- # This should be modified to handle the other cases (i.e they should use existing
80
- # methods)
81
- function parse_variables_with_kw! (exprs, dict, mod, body, varclass, kwargs)
82
- expr = if varclass == :parameters
83
- :(pss = @parameters begin
84
- end )
85
- elseif varclass == :variables
86
- :(vss = @variables begin
87
- end )
88
- end
89
-
74
+ function parse_variables_with_kw! (exprs, var, dict, mod, body, varexpr, varclass, kwargs)
90
75
for arg in body. args
91
76
arg isa LineNumberNode && continue
92
77
MLStyle. @match arg begin
93
-
78
+ Expr (:(= ), a, b:: Number ) => parse_variables! (exprs, var, dict, mod, arg, varclass, kwargs)
79
+ Expr (:(= ), a, b:: Symbol ) => begin
80
+ isdefined (mod, b) ?
81
+ parse_variables! (exprs, var, dict, mod, arg, varclass, kwargs) :
82
+ push! (kwargs, b)
83
+ end
94
84
Expr (:(= ), a, b) => begin
95
85
def = Base. remove_linenums! (b). args[end ]
96
- push! (expr. args[end ]. args[end ]. args, :($ a = $ def))
97
- push! (kwargs, def)
98
- @info " \n In $varclass $kwargs for arg: $arg "
86
+ MLStyle. @match def begin
87
+ Expr (:tuple , x:: Symbol , y) || x:: Symbol => begin
88
+ push! (varexpr. args[end ]. args[end ]. args, :($ a = $ def))
89
+ push! (kwargs, x)
90
+ end
91
+ Expr (:tuple , x:: Number , y) => parse_variables! (exprs, var, dict, mod, arg, varclass, kwargs)
92
+ :: Number => parse_variables! (exprs, var, dict, mod, arg, varclass, kwargs)
93
+ _ => @info " Got $def "
94
+ end
99
95
end
100
96
_ => " got $arg "
101
97
end
102
98
end
103
99
dict[:kwargs ] = kwargs
104
- push! (exprs, expr)
105
100
end
106
101
107
102
function generate_var (a, varclass)
@@ -111,6 +106,7 @@ function generate_var(a, varclass)
111
106
end
112
107
var
113
108
end
109
+
114
110
function generate_var! (dict, a, varclass)
115
111
var = generate_var (a, varclass)
116
112
vd = get! (dict, varclass) do
@@ -119,6 +115,7 @@ function generate_var!(dict, a, varclass)
119
115
vd[a] = Dict {Symbol, Any} ()
120
116
var
121
117
end
118
+
122
119
function generate_var! (dict, a, b, varclass)
123
120
iv = generate_var (b, :variables )
124
121
prev_iv = get! (dict, :independent_variable ) do
@@ -145,21 +142,24 @@ function parse_default(mod, a, kwargs)
145
142
_ => error (" Cannot parse default $a " )
146
143
end
147
144
end
145
+
148
146
function parse_metadata (mod, a)
149
147
MLStyle. @match a begin
150
148
Expr (:vect , eles... ) => Dict (parse_metadata (mod, e) for e in eles)
151
149
Expr (:(= ), a, b) => Symbolics. option_to_metadata_type (Val (a)) => get_var (mod, b)
152
150
_ => error (" Cannot parse metadata $a " )
153
151
end
154
152
end
153
+
155
154
function set_var_metadata (a, ms)
156
155
for (m, v) in ms
157
156
a = setmetadata (a, m, v)
158
157
end
159
158
a
160
159
end
160
+
161
161
function get_var (mod:: Module , b)
162
- b isa Symbol ? getproperty (mod, b) : for_keyword_queue ()
162
+ b isa Symbol ? getproperty (mod, b) : b
163
163
end
164
164
165
165
macro model (name:: Symbol , expr)
@@ -173,9 +173,13 @@ function model_macro(mod, name, expr)
173
173
ext = Ref {Any} (nothing )
174
174
eqs = Expr[]
175
175
icon = Ref {Union{String, URI}} ()
176
+ vs = []
177
+ ps = []
178
+ parexpr = :(pss = @parameters begin
179
+ end )
180
+ varexpr = :(vss = @variables begin
181
+ end )
176
182
kwargs = []
177
- vs, vss = [], []
178
- ps, pss = [], []
179
183
for arg in expr. args
180
184
arg isa LineNumberNode && continue
181
185
if arg. head == :macrocall
@@ -190,9 +194,14 @@ function model_macro(mod, name, expr)
190
194
if iv === nothing
191
195
iv = dict[:independent_variable ] = variable (:t )
192
196
end
197
+
198
+ push! (exprs. args, varexpr)
199
+ push! (exprs. args, parexpr)
200
+
193
201
gui_metadata = isassigned (icon) > 0 ? GUIMetadata (GlobalRef (mod, name), icon[]) :
194
- nothing
195
- sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, [], [$ (ps... ); pss... ];
202
+ nothing
203
+
204
+ sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, [$ (vs... ), vss... ], [$ (ps... ), pss... ];
196
205
systems = [$ (comps... )], name, gui_metadata = $ gui_metadata))
197
206
if ext[] === nothing
198
207
push! (exprs. args, sys)
@@ -210,9 +219,9 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, di
210
219
elseif mname == Symbol (" @extend" )
211
220
parse_extend! (exprs, ext, dict, body)
212
221
elseif mname == Symbol (" @variables" )
213
- parse_variables_with_kw! (exprs, dict, mod, body, :variables , kwargs)
222
+ parse_variables_with_kw! (exprs, vs, dict, mod, body, varexpr , :variables , kwargs)
214
223
elseif mname == Symbol (" @parameters" )
215
- parse_variables_with_kw! (exprs, dict, mod, body, :parameters , kwargs)
224
+ parse_variables_with_kw! (exprs, ps, dict, mod, body, parexpr , :parameters , kwargs)
216
225
elseif mname == Symbol (" @equations" )
217
226
parse_equations! (exprs, eqs, dict, body)
218
227
elseif mname == Symbol (" @icon" )
@@ -222,12 +231,10 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, di
222
231
end
223
232
end
224
233
225
- # components
226
234
function parse_components! (exprs, cs, dict, body, kwargs)
227
235
expr = Expr (:block )
228
236
push! (exprs, expr)
229
237
comps = Vector{String}[]
230
- varnamed = []
231
238
for arg in body. args
232
239
arg isa LineNumberNode && continue
233
240
MLStyle. @match arg begin
@@ -242,45 +249,42 @@ function parse_components!(exprs, cs, dict, body, kwargs)
242
249
push! (b. args, Expr (:kw , :name , Meta. quot (a)))
243
250
arg. args[2 ] = b
244
251
push! (expr. args, arg)
245
- @info " \n\n Expr $expr , b: $b \n\n "
246
252
end
247
253
_ => error (" `@components` only takes assignment expressions. Got $arg " )
248
254
end
249
255
end
250
256
dict[:components ] = comps
251
257
end
252
258
253
- function var_rename (compname, varname)
259
+ function _rename (compname, varname)
254
260
compname = Symbol (compname, :__ , varname)
255
261
end
256
262
257
263
function component_args! (a, b, expr, kwargs)
258
- for i in 1 : lastindex (b. args)
264
+ for i in 2 : lastindex (b. args)
259
265
arg = b. args[i]
266
+ arg isa LineNumberNode && continue
260
267
MLStyle. @match arg begin
261
268
:: Symbol => begin
262
- if b. head == :parameters
263
- _v = varname2 (a, arg)
264
- push! (kwargs, _v)
265
- b. args[i] = Expr (:kw , arg, _v)
266
- end
267
- continue
269
+ _v = _rename (a, arg)
270
+ push! (kwargs, _v)
271
+ b. args[i] = Expr (:kw , arg, _v)
268
272
end
269
273
Expr (:parameters , x... ) => begin
270
274
component_args! (a, arg, expr, kwargs)
271
275
end
272
276
Expr (:kw , x) => begin
273
- _v = varname2 (a, x)
277
+ _v = _rename (a, x)
274
278
b. args[i] = Expr (:kw , x, _v)
275
279
push! (kwargs, _v)
276
280
end
277
281
Expr (:kw , x, y:: Number ) => begin
278
- _v = varname2 (a, x)
282
+ _v = _rename (a, x)
279
283
b. args[i] = Expr (:kw , x, _v)
280
284
push! (kwargs, Expr (:kw , _v, y))
281
285
end
282
286
Expr (:kw , x, y) => begin
283
- _v = varname2 (a, x)
287
+ _v = _rename (a, x)
284
288
push! (expr. args, :($ y = $ _v))
285
289
push! (kwargs, Expr (:kw , _v, y))
286
290
end
@@ -289,7 +293,6 @@ function component_args!(a, b, expr, kwargs)
289
293
end
290
294
end
291
295
292
- #
293
296
function parse_extend! (exprs, ext, dict, body)
294
297
expr = Expr (:block )
295
298
push! (exprs, expr)
@@ -317,17 +320,15 @@ function parse_extend!(exprs, ext, dict, body)
317
320
end
318
321
end
319
322
320
- function parse_variables! (exprs, vs, dict, mod, body , varclass, kwargs)
323
+ function parse_variables! (exprs, vs, dict, mod, arg , varclass, kwargs)
321
324
expr = Expr (:block )
322
325
push! (exprs, expr)
323
- for arg in body. args
324
- arg isa LineNumberNode && continue
325
- vv = parse_variable_def! (dict, mod, arg, varclass, kwargs)
326
- v = Num (vv)
327
- name = getname (v)
328
- push! (vs, name)
329
- push! (expr. args, :($ name = $ v))
330
- end
326
+ arg isa LineNumberNode && return
327
+ vv = parse_variable_def! (dict, mod, arg, varclass, kwargs)
328
+ v = Num (vv)
329
+ name = getname (v)
330
+ push! (vs, name)
331
+ push! (expr. args, :($ name = $ v))
331
332
end
332
333
333
334
function parse_equations! (exprs, eqs, dict, body)
0 commit comments