@@ -178,8 +178,13 @@ function model_macro(mod, name, expr)
178178 ps, pss = [], []
179179 for arg in expr. args
180180 arg isa LineNumberNode && continue
181- arg. head == :macrocall || error (" $arg is not valid syntax. Expected a macro call." )
182- parse_model! (exprs. args, comps, ext, eqs, icon, dict, mod, arg, kwargs)
181+ if arg. head == :macrocall
182+ parse_model! (exprs. args, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, dict, mod, arg, kwargs)
183+ elseif arg. head == :block
184+ push! (exprs. args, arg)
185+ else
186+ error (" $arg is not valid syntax. Expected a macro call." )
187+ end
183188 end
184189 iv = get (dict, :independent_variable , nothing )
185190 if iv === nothing
@@ -194,11 +199,10 @@ function model_macro(mod, name, expr)
194199 else
195200 push! (exprs. args, :($ extend ($ sys, $ (ext[]))))
196201 end
197- @info " \n exprs $exprs final kwargs: $kwargs "
198202 :($ name = $ Model ((; name, $ (kwargs... )) -> $ exprs, $ dict))
199203end
200204
201- function parse_model! (exprs, comps, ext, eqs, icon, dict, mod, arg, kwargs)
205+ function parse_model! (exprs, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, dict, mod, arg, kwargs)
202206 mname = arg. args[1 ]
203207 body = arg. args[end ]
204208 if mname == Symbol (" @components" )
@@ -218,47 +222,7 @@ function parse_model!(exprs, comps, ext, eqs, icon, dict, mod, arg, kwargs)
218222 end
219223end
220224
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-
225+ # components
262226function parse_components! (exprs, cs, dict, body, kwargs)
263227 expr = Expr (:block )
264228 push! (exprs, expr)
@@ -269,23 +233,63 @@ function parse_components!(exprs, cs, dict, body, kwargs)
269233 MLStyle. @match arg begin
270234 Expr (:(= ), a, b) => begin
271235 push! (cs, a)
272- component_args! (a, b, kwargs, varnamed)
273236 push! (comps, [String (a), String (b. args[1 ])])
274237 arg = deepcopy (arg)
275238 b = deepcopy (arg. args[2 ])
276239
277- b . args[ 2 ] = varnamed[ 1 ][ 1 ]
240+ component_args! (a, b, expr, kwargs)
278241
279242 push! (b. args, Expr (:kw , :name , Meta. quot (a)))
280243 arg. args[2 ] = b
281244 push! (expr. args, arg)
245+ @info " \n\n Expr $expr , b: $b \n\n "
282246 end
283247 _ => error (" `@components` only takes assignment expressions. Got $arg " )
284248 end
285249 end
286250 dict[:components ] = comps
287251end
288252
253+ function var_rename (compname, varname)
254+ compname = Symbol (compname, :__ , varname)
255+ end
256+
257+ function component_args! (a, b, expr, kwargs)
258+ for i in 1 : lastindex (b. args)
259+ arg = b. args[i]
260+ MLStyle. @match arg begin
261+ :: 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
268+ end
269+ Expr (:parameters , x... ) => begin
270+ component_args! (a, arg, expr, kwargs)
271+ end
272+ Expr (:kw , x) => begin
273+ _v = varname2 (a, x)
274+ b. args[i] = Expr (:kw , x, _v)
275+ push! (kwargs, _v)
276+ end
277+ Expr (:kw , x, y:: Number ) => begin
278+ _v = varname2 (a, x)
279+ b. args[i] = Expr (:kw , x, _v)
280+ push! (kwargs, Expr (:kw , _v, y))
281+ end
282+ Expr (:kw , x, y) => begin
283+ _v = varname2 (a, x)
284+ push! (expr. args, :($ y = $ _v))
285+ push! (kwargs, Expr (:kw , _v, y))
286+ end
287+ _ => " Got this: $arg "
288+ end
289+ end
290+ end
291+
292+ #
289293function parse_extend! (exprs, ext, dict, body)
290294 expr = Expr (:block )
291295 push! (exprs, expr)
0 commit comments