@@ -8,8 +8,6 @@ struct Model{F, S}
8
8
end
9
9
(m:: Model )(args... ; kw... ) = m. f (args... ; kw... )
10
10
11
- using MLStyle
12
-
13
11
function connector_macro (mod, name, body)
14
12
if ! Meta. isexpr (body, :block )
15
13
err = """
82
80
# methods)
83
81
function parse_variables_with_kw! (exprs, dict, mod, body, varclass, kwargs)
84
82
expr = if varclass == :parameters
85
- :(ps = @parameters begin
83
+ :(pss = @parameters begin
86
84
end )
87
85
elseif varclass == :variables
88
- :(vs = @variables begin
86
+ :(vss = @variables begin
89
87
end )
90
88
end
91
89
@@ -97,9 +95,12 @@ function parse_variables_with_kw!(exprs, dict, mod, body, varclass, kwargs)
97
95
def = Base. remove_linenums! (b). args[end ]
98
96
push! (expr. args[end ]. args[end ]. args, :($ a = $ def))
99
97
push! (kwargs, def)
98
+ @info " \n In $varclass $kwargs for arg: $arg "
100
99
end
100
+ _ => " got $arg "
101
101
end
102
102
end
103
+ dict[:kwargs ] = kwargs
103
104
push! (exprs, expr)
104
105
end
105
106
@@ -173,6 +174,8 @@ function model_macro(mod, name, expr)
173
174
eqs = Expr[]
174
175
icon = Ref {Union{String, URI}} ()
175
176
kwargs = []
177
+ vs, vss = [], []
178
+ ps, pss = [], []
176
179
for arg in expr. args
177
180
arg isa LineNumberNode && continue
178
181
arg. head == :macrocall || error (" $arg is not valid syntax. Expected a macro call." )
@@ -184,22 +187,22 @@ function model_macro(mod, name, expr)
184
187
end
185
188
gui_metadata = isassigned (icon) > 0 ? GUIMetadata (GlobalRef (mod, name), icon[]) :
186
189
nothing
187
- sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, vs, ps ;
190
+ sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, [], [ $ (ps ... ); pss ... ] ;
188
191
systems = [$ (comps... )], name, gui_metadata = $ gui_metadata))
189
192
if ext[] === nothing
190
193
push! (exprs. args, sys)
191
194
else
192
195
push! (exprs. args, :($ extend ($ sys, $ (ext[]))))
193
196
end
194
-
197
+ @info " \n exprs $exprs final kwargs: $kwargs "
195
198
:($ name = $ Model ((; name, $ (kwargs... )) -> $ exprs, $ dict))
196
199
end
197
200
198
201
function parse_model! (exprs, comps, ext, eqs, icon, dict, mod, arg, kwargs)
199
202
mname = arg. args[1 ]
200
203
body = arg. args[end ]
201
204
if mname == Symbol (" @components" )
202
- parse_components! (exprs, comps, dict, body)
205
+ parse_components! (exprs, comps, dict, body, kwargs )
203
206
elseif mname == Symbol (" @extend" )
204
207
parse_extend! (exprs, ext, dict, body)
205
208
elseif mname == Symbol (" @variables" )
@@ -215,18 +218,64 @@ function parse_model!(exprs, comps, ext, eqs, icon, dict, mod, arg, kwargs)
215
218
end
216
219
end
217
220
218
- function parse_components! (exprs, cs, dict, body)
221
+ function var_rename (compname, varname:: Expr , arglist)
222
+ @info typeof (varname)
223
+ compname = Symbol (compname, :__ , varname. args[1 ])
224
+ push! (arglist, Expr (:(= ), compname, varname. args[2 ]))
225
+ @info " $(typeof (varname)) | the arglist @220 is $arglist "
226
+ return Expr (:kw , varname, compname)
227
+ end
228
+
229
+ function var_rename (compname, varname, arglist)
230
+ compname = Symbol (compname, :__ , varname)
231
+ push! (arglist, :($ compname))
232
+ @info " $(typeof (varname)) | the arglist @229 is $arglist "
233
+ return Expr (:kw , varname, compname)
234
+ end
235
+
236
+ function component_args! (compname, comparg, arglist, varnamed)
237
+ for arg in comparg. args
238
+ arg isa LineNumberNode && continue
239
+ MLStyle. @match arg begin
240
+ Expr (:parameters , a, b) => begin
241
+ component_args! (compname, arg, arglist, varnamed)
242
+ end
243
+ Expr (:parameters , Expr) => begin
244
+ # push!(varnamed , var_rename(compname, a, arglist))
245
+ push! (varnamed , var_rename .(Ref (compname), arg. args, Ref (arglist)))
246
+ end
247
+ Expr (:parameters , a) => begin
248
+ # push!(varnamed , var_rename(compname, a, arglist))
249
+ for a_arg in a. args
250
+ push! (varnamed , var_rename (compname, a_arg, arglist))
251
+ end
252
+ end
253
+ Expr (:kw , a, b) => begin
254
+ push! (varnamed , var_rename (compname, a, arglist))
255
+ end
256
+ :: Symbol => continue
257
+ _ => @info " got $arg "
258
+ end
259
+ end
260
+ end
261
+
262
+ function parse_components! (exprs, cs, dict, body, kwargs)
219
263
expr = Expr (:block )
220
264
push! (exprs, expr)
221
265
comps = Vector{String}[]
266
+ varnamed = []
222
267
for arg in body. args
223
268
arg isa LineNumberNode && continue
224
269
MLStyle. @match arg begin
225
270
Expr (:(= ), a, b) => begin
226
271
push! (cs, a)
272
+ component_args! (a, b, kwargs, varnamed)
227
273
push! (comps, [String (a), String (b. args[1 ])])
228
274
arg = deepcopy (arg)
229
275
b = deepcopy (arg. args[2 ])
276
+
277
+ b. args[2 ] = varnamed[1 ][1 ]
278
+
230
279
push! (b. args, Expr (:kw , :name , Meta. quot (a)))
231
280
arg. args[2 ] = b
232
281
push! (expr. args, arg)
0 commit comments