@@ -9,18 +9,6 @@ for f in (:connector, :model)
99 macro $f (name:: Symbol , body)
1010 esc ($ (Symbol (f, :_macro ))(__module__, name, body))
1111 end
12-
13- macro $f (fcall:: Expr , body)
14- fcall. head == :call || " Couldn't comprehend the $f $arg "
15-
16- arglist, kwargs = if lastindex (fcall. args) > 1 && is_kwarg (fcall. args[2 ])
17- (lastindex (fcall. args) > 2 ? Set (fcall. args[3 : end ]) : Set ()),
18- Set (fcall. args[2 ]. args)
19- else
20- Set (), Set (fcall. args[2 : end ])
21- end
22- esc ($ (Symbol (f, :_macro ))(__module__, fcall. args[1 ], body; arglist, kwargs))
23- end
2412 end
2513end
2614
@@ -43,14 +31,15 @@ function connector_macro(mod, name, body; arglist = Set([]), kwargs = Set([]))
4331 vs = []
4432 icon = Ref {Union{String, URI}} ()
4533 dict = Dict {Symbol, Any} ()
34+ dict[:kwargs ] = Dict {Symbol, Any} ()
4635 expr = Expr (:block )
4736 for arg in body. args
4837 arg isa LineNumberNode && continue
4938 if arg. head == :macrocall && arg. args[1 ] == Symbol (" @icon" )
5039 parse_icon! (icon, dict, dict, arg. args[end ])
5140 continue
5241 end
53- parse_variable_arg! (expr, vs, dict, mod, arg, :variables )
42+ parse_variable_arg! (expr, vs, dict, mod, arg, :variables , kwargs )
5443 end
5544 iv = get (dict, :independent_variable , nothing )
5645 if iv === nothing
@@ -68,18 +57,33 @@ function connector_macro(mod, name, body; arglist = Set([]), kwargs = Set([]))
6857 end
6958end
7059
71- function parse_variable_def! (dict, mod, arg, varclass)
60+ function parse_variable_def! (dict, mod, arg, varclass, kwargs, def = nothing )
7261 arg isa LineNumberNode && return
7362 MLStyle. @match arg begin
74- :: Symbol => (generate_var! (dict, arg, varclass), nothing )
75- Expr (:call , a, b) => (generate_var! (dict, a, b, varclass), nothing )
63+ a:: Symbol => begin
64+ push! (kwargs, Expr (:kw , a, def))
65+ var = generate_var! (dict, a, varclass)
66+ dict[:kwargs ][getname (var)] = def
67+ (var, nothing )
68+ end
69+ Expr (:call , a, b) => begin
70+ push! (kwargs, Expr (:kw , a, def))
71+ var = generate_var! (dict, a, b, varclass)
72+ dict[:kwargs ][getname (var)] = def
73+ (var, nothing )
74+ end
7675 Expr (:(= ), a, b) => begin
77- var, _ = parse_variable_def! (dict, mod, a, varclass )
76+ Base . remove_linenums! (b )
7877 def, meta = parse_default (mod, b)
78+ var, _ = parse_variable_def! (dict, mod, a, varclass, kwargs, def)
7979 dict[varclass][getname (var)][:default ] = def
8080 if typeof (def) != Symbol
8181 var = setdefault (var, def)
8282 def = nothing
83+ else
84+ def in [keys (dict[:kwargs ])... ;] ||
85+ error (" $def is not a known parameter or variable" )
86+ var = setdefault (var, def)
8387 end
8488 if ! isnothing (meta)
8589 if (ct = get (meta, VariableConnectType, nothing )) != = nothing
@@ -90,7 +94,7 @@ function parse_variable_def!(dict, mod, arg, varclass)
9094 (var, def)
9195 end
9296 Expr (:tuple , a, b) => begin
93- var, _ = parse_variable_def! (dict, mod, a, varclass)
97+ var, _ = parse_variable_def! (dict, mod, a, varclass, kwargs )
9498 meta = parse_metadata (mod, b)
9599 if (ct = get (meta, VariableConnectType, nothing )) != = nothing
96100 dict[varclass][getname (var)][:connection_type ] = nameof (ct)
@@ -110,6 +114,7 @@ function generate_var(a, varclass)
110114end
111115
112116function generate_var! (dict, a, varclass)
117+ # var = generate_var(Symbol("#", a), varclass)
113118 var = generate_var (a, varclass)
114119 vd = get! (dict, varclass) do
115120 Dict {Symbol, Dict{Symbol, Any}} ()
@@ -145,6 +150,14 @@ function parse_default(mod, a)
145150 (def, meta)
146151 end
147152 :: Symbol || :: Number => (a, nothing )
153+ Expr (:call , a... ) => begin
154+ def = parse_default .(Ref (mod), a)
155+ expr = Expr (:call )
156+ for (d, _) in def
157+ push! (expr. args, d)
158+ end
159+ (expr, nothing )
160+ end
148161 _ => error (" Cannot parse default $a " )
149162 end
150163end
171184function model_macro (mod, name, expr; arglist = Set ([]), kwargs = Set ([]))
172185 exprs = Expr (:block )
173186 dict = Dict {Symbol, Any} ()
187+ dict[:kwargs ] = Dict {Symbol, Any} ()
174188 comps = Symbol[]
175189 ext = Ref {Any} (nothing )
176190 eqs = Expr[]
@@ -198,7 +212,7 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
198212 nothing
199213
200214 sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, [$ (vs... )], [$ (ps... )];
201- systems = [$ (comps... )], name, gui_metadata = $ gui_metadata))
215+ systems = [$ (comps... )], name, gui_metadata = $ gui_metadata)) # , defaults = $defaults))
202216 if ext[] === nothing
203217 push! (exprs. args, sys)
204218 else
@@ -217,9 +231,9 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, ps, dict,
217231 elseif mname == Symbol (" @extend" )
218232 parse_extend! (exprs, ext, dict, body)
219233 elseif mname == Symbol (" @variables" )
220- parse_variables! (exprs, vs, dict, mod, body, :variables )
234+ parse_variables! (exprs, vs, dict, mod, body, :variables , kwargs )
221235 elseif mname == Symbol (" @parameters" )
222- parse_variables! (exprs, ps, dict, mod, body, :parameters )
236+ parse_variables! (exprs, ps, dict, mod, body, :parameters , kwargs )
223237 elseif mname == Symbol (" @equations" )
224238 parse_equations! (exprs, eqs, dict, body)
225239 elseif mname == Symbol (" @icon" )
@@ -321,21 +335,20 @@ function parse_extend!(exprs, ext, dict, body)
321335 end
322336end
323337
324- function parse_variable_arg! (expr, vs, dict, mod, arg, varclass)
325- vv, def = parse_variable_def! (dict, mod, arg, varclass)
338+ function parse_variable_arg! (expr, vs, dict, mod, arg, varclass, kwargs )
339+ vv, _ = parse_variable_def! (dict, mod, arg, varclass, kwargs )
326340 v = Num (vv)
327341 name = getname (v)
328342 push! (vs, name)
329- def === nothing ? push! (expr. args, :($ name = $ v)) :
330- push! (expr. args, :($ name = $ setdefault ($ v, $ def)))
343+ push! (expr. args, :($ name = $ name === nothing ? $ vv : $ setdefault ($ vv, $ name)))
331344end
332345
333- function parse_variables! (exprs, vs, dict, mod, body, varclass)
346+ function parse_variables! (exprs, vs, dict, mod, body, varclass, kwargs )
334347 expr = Expr (:block )
335348 push! (exprs, expr)
336349 for arg in body. args
337350 arg isa LineNumberNode && continue
338- parse_variable_arg! (expr, vs, dict, mod, arg, varclass)
351+ parse_variable_arg! (expr, vs, dict, mod, arg, varclass, kwargs )
339352 end
340353end
341354
0 commit comments