@@ -32,7 +32,7 @@ function connector_macro(mod, name, body)
32
32
parse_icon! (icon, dict, dict, arg. args[end ])
33
33
continue
34
34
end
35
- push! (vs, Num (parse_variable_def! (dict, mod, arg, :variables )))
35
+ push! (vs, Num (parse_variable_def! (dict, mod, arg, :variables , kwargs )))
36
36
end
37
37
iv = get (dict, :independent_variable , nothing )
38
38
if iv === nothing
@@ -49,18 +49,19 @@ function connector_macro(mod, name, body)
49
49
end
50
50
end
51
51
52
- function parse_variable_def! (dict, mod, arg, varclass)
52
+ function parse_variable_def! (dict, mod, arg, varclass, kwargs )
53
53
MLStyle. @match arg begin
54
54
:: Symbol => generate_var! (dict, arg, varclass)
55
55
Expr (:call , a, b) => generate_var! (dict, a, b, varclass)
56
56
Expr (:(= ), a, b) => begin
57
- var = parse_variable_def! (dict, mod, a, varclass)
58
- def = parse_default (mod, b)
57
+ var = parse_variable_def! (dict, mod, a, varclass, kwargs )
58
+ def = parse_default (mod, b, kwargs )
59
59
dict[varclass][getname (var)][:default ] = def
60
- setdefault (var, def)
60
+ var = setdefault (var, def)
61
+ var
61
62
end
62
63
Expr (:tuple , a, b) => begin
63
- var = parse_variable_def! (dict, mod, a, varclass)
64
+ var = parse_variable_def! (dict, mod, a, varclass, kwargs )
64
65
meta = parse_metadata (mod, b)
65
66
if (ct = get (meta, VariableConnectType, nothing )) != = nothing
66
67
dict[varclass][getname (var)][:connection_type ] = nameof (ct)
@@ -102,10 +103,16 @@ function generate_var!(dict, a, b, varclass)
102
103
end
103
104
var
104
105
end
105
- function parse_default (mod, a)
106
+
107
+ function set_kwargs! (kwargs, a)
108
+ push! (kwargs, a)
109
+ return a
110
+ end
111
+
112
+ function parse_default (mod, a, kwargs)
106
113
a = Base. remove_linenums! (deepcopy (a))
107
114
MLStyle. @match a begin
108
- Expr (:block , a) => get_var (mod , a)
115
+ Expr (:block , a) => set_kwargs! (kwargs , a)
109
116
:: Symbol => get_var (mod, a)
110
117
:: Number => a
111
118
_ => error (" Cannot parse default $a " )
@@ -141,10 +148,11 @@ function model_macro(mod, name, expr)
141
148
ps = Symbol[]
142
149
eqs = Expr[]
143
150
icon = Ref {Union{String, URI}} ()
151
+ kwargs = []
144
152
for arg in expr. args
145
153
arg isa LineNumberNode && continue
146
154
arg. head == :macrocall || error (" $arg is not valid syntax. Expected a macro call." )
147
- parse_model! (exprs. args, comps, ext, eqs, vs, ps, icon, dict, mod, arg)
155
+ parse_model! (exprs. args, comps, ext, eqs, vs, ps, icon, dict, mod, arg, kwargs )
148
156
end
149
157
iv = get (dict, :independent_variable , nothing )
150
158
if iv === nothing
@@ -159,20 +167,21 @@ function model_macro(mod, name, expr)
159
167
else
160
168
push! (exprs. args, :($ extend ($ sys, $ (ext[]))))
161
169
end
162
- :($ name = $ Model ((; name) -> $ exprs, $ dict))
170
+ @info " Exprs: $exprs "
171
+ :($ name = $ Model ((; name, kwargs... ) -> $ exprs, $ dict))
163
172
end
164
173
165
- function parse_model! (exprs, comps, ext, eqs, vs, ps, icon, dict, mod, arg)
174
+ function parse_model! (exprs, comps, ext, eqs, vs, ps, icon, dict, mod, arg, kwargs )
166
175
mname = arg. args[1 ]
167
176
body = arg. args[end ]
168
177
if mname == Symbol (" @components" )
169
178
parse_components! (exprs, comps, dict, body)
170
179
elseif mname == Symbol (" @extend" )
171
180
parse_extend! (exprs, ext, dict, body)
172
181
elseif mname == Symbol (" @variables" )
173
- parse_variables! (exprs, vs, dict, mod, body, :variables )
182
+ parse_variables! (exprs, vs, dict, mod, body, :variables , kwargs )
174
183
elseif mname == Symbol (" @parameters" )
175
- parse_variables! (exprs, ps, dict, mod, body, :parameters )
184
+ parse_variables! (exprs, ps, dict, mod, body, :parameters , kwargs )
176
185
elseif mname == Symbol (" @equations" )
177
186
parse_equations! (exprs, eqs, dict, body)
178
187
elseif mname == Symbol (" @icon" )
@@ -231,12 +240,12 @@ function parse_extend!(exprs, ext, dict, body)
231
240
end
232
241
end
233
242
234
- function parse_variables! (exprs, vs, dict, mod, body, varclass)
243
+ function parse_variables! (exprs, vs, dict, mod, body, varclass, kwargs )
235
244
expr = Expr (:block )
236
245
push! (exprs, expr)
237
246
for arg in body. args
238
247
arg isa LineNumberNode && continue
239
- vv = parse_variable_def! (dict, mod, arg, varclass)
248
+ vv = parse_variable_def! (dict, mod, arg, varclass, kwargs )
240
249
v = Num (vv)
241
250
name = getname (v)
242
251
push! (vs, name)
0 commit comments