@@ -79,17 +79,17 @@ function parse_variables_with_kw!(exprs, var, dict, mod, body, varexpr, varclass
79
79
Expr (:(= ), a, b:: Symbol ) => begin
80
80
isdefined (mod, b) ?
81
81
parse_variables! (exprs, var, dict, mod, arg, varclass, kwargs) :
82
- push! (kwargs, b )
82
+ push! (varexpr . args[ end ] . args[ end ] . args, arg )
83
83
end
84
84
Expr (:(= ), a, b) => begin
85
- def = Base. remove_linenums! (b). args[ end ]
85
+ def = Base. remove_linenums! (b)
86
86
MLStyle. @match def begin
87
87
Expr (:tuple , x:: Symbol , y) || x:: Symbol => begin
88
- push! (varexpr. args[end ]. args[end ]. args, :($ a = $ def))
89
- push! (kwargs, x)
88
+ push! (varexpr. args[end ]. args[end ]. args, :($ a = $ (def. args[end ])))
90
89
end
91
- Expr (:tuple , x:: Number , y) => parse_variables! (exprs, var, dict, mod, arg, varclass, kwargs)
90
+ Expr (:tuple , x:: Number , y) => ( @info " 111 " ; parse_variables! (exprs, var, dict, mod, arg, varclass, kwargs) )
92
91
:: Number => parse_variables! (exprs, var, dict, mod, arg, varclass, kwargs)
92
+ :: Expr => push! (varexpr. args[end ]. args[end ]. args, :($ a = $ (def. args[end ])))
93
93
_ => @info " Got $def "
94
94
end
95
95
end
@@ -166,7 +166,21 @@ macro model(name::Symbol, expr)
166
166
esc (model_macro (__module__, name, expr))
167
167
end
168
168
169
- function model_macro (mod, name, expr)
169
+ @inline is_kwarg (:: Symbol ) = false
170
+ @inline is_kwarg (e:: Expr ) = (e. head == :parameters )
171
+
172
+ macro model (fcall:: Expr , expr)
173
+ fcall. head == :call || " Couldn't comprehend the model $arg "
174
+
175
+ arglist, kwargs = if lastindex (fcall. args) > 1 && is_kwarg (fcall. args[2 ])
176
+ (lastindex (fcall. args) > 2 ? (@info 1 ; Set (fcall. args[3 : end ])) : (@info 2 ; Set ())), Set (fcall. args[2 ]. args)
177
+ else
178
+ Set (), Set (fcall. args[2 : end ])
179
+ end
180
+ esc (model_macro (__module__, fcall. args[1 ], expr; arglist, kwargs))
181
+ end
182
+
183
+ function model_macro (mod, name, expr; arglist = Set ([]), kwargs = Set ([]))
170
184
exprs = Expr (:block )
171
185
dict = Dict {Symbol, Any} ()
172
186
comps = Symbol[]
@@ -179,7 +193,7 @@ function model_macro(mod, name, expr)
179
193
end )
180
194
varexpr = :(vss = @variables begin
181
195
end )
182
- kwargs = []
196
+
183
197
for arg in expr. args
184
198
arg isa LineNumberNode && continue
185
199
if arg. head == :macrocall
@@ -208,7 +222,8 @@ function model_macro(mod, name, expr)
208
222
else
209
223
push! (exprs. args, :($ extend ($ sys, $ (ext[]))))
210
224
end
211
- :($ name = $ Model ((; name, $ (kwargs... )) -> $ exprs, $ dict))
225
+
226
+ :($ name = $ Model (($ (arglist... ); name, $ (kwargs... )) -> $ exprs, $ dict))
212
227
end
213
228
214
229
function parse_model! (exprs, comps, ext, eqs, icon, vs, varexpr, ps, parexpr, dict, mod, arg, kwargs)
@@ -261,7 +276,8 @@ function _rename(compname, varname)
261
276
end
262
277
263
278
function component_args! (a, b, expr, kwargs)
264
- for i in 2 : lastindex (b. args)
279
+ start = b. head == :parameters ? 1 : 2
280
+ for i in start: lastindex (b. args)
265
281
arg = b. args[i]
266
282
arg isa LineNumberNode && continue
267
283
MLStyle. @match arg begin
0 commit comments