@@ -72,6 +72,37 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs)
72
72
end
73
73
end
74
74
75
+ function for_keyword_queue ()
76
+ # These args contain potential keywords
77
+ # Handle it along with vars without defaults
78
+ end
79
+
80
+ # Takes in args and populates kw and var definition exprs.
81
+ # This should be modified to handle the other cases (i.e they should use existing
82
+ # methods)
83
+ function parse_variables_with_kw! (exprs, dict, mod, body, varclass, kwargs)
84
+ expr = if varclass == :parameters
85
+ :(ps = @parameters begin
86
+ end )
87
+ elseif varclass == :variables
88
+ :(vs = @variables begin
89
+ end )
90
+ end
91
+
92
+ for arg in body. args
93
+ arg isa LineNumberNode && continue
94
+ MLStyle. @match arg begin
95
+
96
+ Expr (:(= ), a, b) => begin
97
+ def = Base. remove_linenums! (b). args[end ]
98
+ push! (expr. args[end ]. args[end ]. args, :($ a = $ def))
99
+ push! (kwargs, def)
100
+ end
101
+ end
102
+ end
103
+ push! (exprs, expr)
104
+ end
105
+
75
106
function generate_var (a, varclass)
76
107
var = Symbolics. variable (a)
77
108
if varclass == :parameters
@@ -104,15 +135,10 @@ function generate_var!(dict, a, b, varclass)
104
135
var
105
136
end
106
137
107
- function set_kwargs! (kwargs, a)
108
- push! (kwargs, a)
109
- return a
110
- end
111
-
112
138
function parse_default (mod, a, kwargs)
113
139
a = Base. remove_linenums! (deepcopy (a))
114
140
MLStyle. @match a begin
115
- Expr (:block , a) => set_kwargs! (kwargs , a)
141
+ Expr (:block , a) => get_var (mod , a)
116
142
:: Symbol => get_var (mod, a)
117
143
:: Number => a
118
144
_ => error (" Cannot parse default $a " )
@@ -132,7 +158,7 @@ function set_var_metadata(a, ms)
132
158
a
133
159
end
134
160
function get_var (mod:: Module , b)
135
- b isa Symbol ? getproperty (mod, b) : b
161
+ b isa Symbol ? getproperty (mod, b) : for_keyword_queue ()
136
162
end
137
163
138
164
macro model (name:: Symbol , expr)
@@ -144,44 +170,42 @@ function model_macro(mod, name, expr)
144
170
dict = Dict {Symbol, Any} ()
145
171
comps = Symbol[]
146
172
ext = Ref {Any} (nothing )
147
- vs = Symbol[]
148
- ps = Symbol[]
149
173
eqs = Expr[]
150
174
icon = Ref {Union{String, URI}} ()
151
175
kwargs = []
152
176
for arg in expr. args
153
177
arg isa LineNumberNode && continue
154
178
arg. head == :macrocall || error (" $arg is not valid syntax. Expected a macro call." )
155
- parse_model! (exprs. args, comps, ext, eqs, vs, ps, icon, dict, mod, arg, kwargs)
179
+ parse_model! (exprs. args, comps, ext, eqs, icon, dict, mod, arg, kwargs)
156
180
end
157
181
iv = get (dict, :independent_variable , nothing )
158
182
if iv === nothing
159
183
iv = dict[:independent_variable ] = variable (:t )
160
184
end
161
185
gui_metadata = isassigned (icon) > 0 ? GUIMetadata (GlobalRef (mod, name), icon[]) :
162
186
nothing
163
- sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, [ $ (vs ... )], [ $ (ps ... )] ;
187
+ sys = :($ ODESystem ($ Equation[$ (eqs... )], $ iv, vs, ps ;
164
188
systems = [$ (comps... )], name, gui_metadata = $ gui_metadata))
165
189
if ext[] === nothing
166
190
push! (exprs. args, sys)
167
191
else
168
192
push! (exprs. args, :($ extend ($ sys, $ (ext[]))))
169
193
end
170
- @info " Exprs: $exprs "
171
- :($ name = $ Model ((; name, kwargs... ) -> $ exprs, $ dict))
194
+
195
+ :($ name = $ Model ((; name, $ ( kwargs... ) ) -> $ exprs, $ dict))
172
196
end
173
197
174
- function parse_model! (exprs, comps, ext, eqs, vs, ps, icon, dict, mod, arg, kwargs)
198
+ function parse_model! (exprs, comps, ext, eqs, icon, dict, mod, arg, kwargs)
175
199
mname = arg. args[1 ]
176
200
body = arg. args[end ]
177
201
if mname == Symbol (" @components" )
178
202
parse_components! (exprs, comps, dict, body)
179
203
elseif mname == Symbol (" @extend" )
180
204
parse_extend! (exprs, ext, dict, body)
181
205
elseif mname == Symbol (" @variables" )
182
- parse_variables ! (exprs, vs , dict, mod, body, :variables , kwargs)
206
+ parse_variables_with_kw ! (exprs, dict, mod, body, :variables , kwargs)
183
207
elseif mname == Symbol (" @parameters" )
184
- parse_variables ! (exprs, ps , dict, mod, body, :parameters , kwargs)
208
+ parse_variables_with_kw ! (exprs, dict, mod, body, :parameters , kwargs)
185
209
elseif mname == Symbol (" @equations" )
186
210
parse_equations! (exprs, eqs, dict, body)
187
211
elseif mname == Symbol (" @icon" )
0 commit comments