@@ -9,18 +9,6 @@ for f in (:connector, :model)
9
9
macro $f (name:: Symbol , body)
10
10
esc ($ (Symbol (f, :_macro ))(__module__, name, body))
11
11
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
24
12
end
25
13
end
26
14
@@ -43,14 +31,15 @@ function connector_macro(mod, name, body; arglist = Set([]), kwargs = Set([]))
43
31
vs = []
44
32
icon = Ref {Union{String, URI}} ()
45
33
dict = Dict {Symbol, Any} ()
34
+ dict[:kwargs ] = Dict {Symbol, Any} ()
46
35
expr = Expr (:block )
47
36
for arg in body. args
48
37
arg isa LineNumberNode && continue
49
38
if arg. head == :macrocall && arg. args[1 ] == Symbol (" @icon" )
50
39
parse_icon! (icon, dict, dict, arg. args[end ])
51
40
continue
52
41
end
53
- parse_variable_arg! (expr, vs, dict, mod, arg, :variables )
42
+ parse_variable_arg! (expr, vs, dict, mod, arg, :variables , kwargs )
54
43
end
55
44
iv = get (dict, :independent_variable , nothing )
56
45
if iv === nothing
@@ -68,18 +57,33 @@ function connector_macro(mod, name, body; arglist = Set([]), kwargs = Set([]))
68
57
end
69
58
end
70
59
71
- function parse_variable_def! (dict, mod, arg, varclass)
60
+ function parse_variable_def! (dict, mod, arg, varclass, kwargs, def = nothing )
72
61
arg isa LineNumberNode && return
73
62
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
76
75
Expr (:(= ), a, b) => begin
77
- var, _ = parse_variable_def! (dict, mod, a, varclass )
76
+ Base . remove_linenums! (b )
78
77
def, meta = parse_default (mod, b)
78
+ var, _ = parse_variable_def! (dict, mod, a, varclass, kwargs, def)
79
79
dict[varclass][getname (var)][:default ] = def
80
80
if typeof (def) != Symbol
81
81
var = setdefault (var, def)
82
82
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)
83
87
end
84
88
if ! isnothing (meta)
85
89
if (ct = get (meta, VariableConnectType, nothing )) != = nothing
@@ -90,7 +94,7 @@ function parse_variable_def!(dict, mod, arg, varclass)
90
94
(var, def)
91
95
end
92
96
Expr (:tuple , a, b) => begin
93
- var, _ = parse_variable_def! (dict, mod, a, varclass)
97
+ var, _ = parse_variable_def! (dict, mod, a, varclass, kwargs )
94
98
meta = parse_metadata (mod, b)
95
99
if (ct = get (meta, VariableConnectType, nothing )) != = nothing
96
100
dict[varclass][getname (var)][:connection_type ] = nameof (ct)
@@ -110,6 +114,7 @@ function generate_var(a, varclass)
110
114
end
111
115
112
116
function generate_var! (dict, a, varclass)
117
+ # var = generate_var(Symbol("#", a), varclass)
113
118
var = generate_var (a, varclass)
114
119
vd = get! (dict, varclass) do
115
120
Dict {Symbol, Dict{Symbol, Any}} ()
@@ -145,6 +150,14 @@ function parse_default(mod, a)
145
150
(def, meta)
146
151
end
147
152
:: 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
148
161
_ => error (" Cannot parse default $a " )
149
162
end
150
163
end
171
184
function model_macro (mod, name, expr; arglist = Set ([]), kwargs = Set ([]))
172
185
exprs = Expr (:block )
173
186
dict = Dict {Symbol, Any} ()
187
+ dict[:kwargs ] = Dict {Symbol, Any} ()
174
188
comps = Symbol[]
175
189
ext = Ref {Any} (nothing )
176
190
eqs = Expr[]
@@ -198,7 +212,7 @@ function model_macro(mod, name, expr; arglist = Set([]), kwargs = Set([]))
198
212
nothing
199
213
200
214
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))
202
216
if ext[] === nothing
203
217
push! (exprs. args, sys)
204
218
else
@@ -217,9 +231,9 @@ function parse_model!(exprs, comps, ext, eqs, icon, vs, ps, dict,
217
231
elseif mname == Symbol (" @extend" )
218
232
parse_extend! (exprs, ext, dict, body)
219
233
elseif mname == Symbol (" @variables" )
220
- parse_variables! (exprs, vs, dict, mod, body, :variables )
234
+ parse_variables! (exprs, vs, dict, mod, body, :variables , kwargs )
221
235
elseif mname == Symbol (" @parameters" )
222
- parse_variables! (exprs, ps, dict, mod, body, :parameters )
236
+ parse_variables! (exprs, ps, dict, mod, body, :parameters , kwargs )
223
237
elseif mname == Symbol (" @equations" )
224
238
parse_equations! (exprs, eqs, dict, body)
225
239
elseif mname == Symbol (" @icon" )
@@ -321,21 +335,20 @@ function parse_extend!(exprs, ext, dict, body)
321
335
end
322
336
end
323
337
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 )
326
340
v = Num (vv)
327
341
name = getname (v)
328
342
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)))
331
344
end
332
345
333
- function parse_variables! (exprs, vs, dict, mod, body, varclass)
346
+ function parse_variables! (exprs, vs, dict, mod, body, varclass, kwargs )
334
347
expr = Expr (:block )
335
348
push! (exprs, expr)
336
349
for arg in body. args
337
350
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 )
339
352
end
340
353
end
341
354
0 commit comments