@@ -178,8 +178,13 @@ function model_macro(mod, name, expr)
178
178
ps, pss = [], []
179
179
for arg in expr. args
180
180
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
183
188
end
184
189
iv = get (dict, :independent_variable , nothing )
185
190
if iv === nothing
@@ -194,11 +199,10 @@ function model_macro(mod, name, expr)
194
199
else
195
200
push! (exprs. args, :($ extend ($ sys, $ (ext[]))))
196
201
end
197
- @info " \n exprs $exprs final kwargs: $kwargs "
198
202
:($ name = $ Model ((; name, $ (kwargs... )) -> $ exprs, $ dict))
199
203
end
200
204
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)
202
206
mname = arg. args[1 ]
203
207
body = arg. args[end ]
204
208
if mname == Symbol (" @components" )
@@ -218,47 +222,7 @@ function parse_model!(exprs, comps, ext, eqs, icon, dict, mod, arg, kwargs)
218
222
end
219
223
end
220
224
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
262
226
function parse_components! (exprs, cs, dict, body, kwargs)
263
227
expr = Expr (:block )
264
228
push! (exprs, expr)
@@ -269,23 +233,63 @@ function parse_components!(exprs, cs, dict, body, kwargs)
269
233
MLStyle. @match arg begin
270
234
Expr (:(= ), a, b) => begin
271
235
push! (cs, a)
272
- component_args! (a, b, kwargs, varnamed)
273
236
push! (comps, [String (a), String (b. args[1 ])])
274
237
arg = deepcopy (arg)
275
238
b = deepcopy (arg. args[2 ])
276
239
277
- b . args[ 2 ] = varnamed[ 1 ][ 1 ]
240
+ component_args! (a, b, expr, kwargs)
278
241
279
242
push! (b. args, Expr (:kw , :name , Meta. quot (a)))
280
243
arg. args[2 ] = b
281
244
push! (expr. args, arg)
245
+ @info " \n\n Expr $expr , b: $b \n\n "
282
246
end
283
247
_ => error (" `@components` only takes assignment expressions. Got $arg " )
284
248
end
285
249
end
286
250
dict[:components ] = comps
287
251
end
288
252
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
+ #
289
293
function parse_extend! (exprs, ext, dict, body)
290
294
expr = Expr (:block )
291
295
push! (exprs, expr)
0 commit comments