@@ -11,7 +11,7 @@ macro connector(expr)
11
11
end
12
12
13
13
macro connector (name:: Symbol , body)
14
- esc (connector_macro (( @__MODULE__ ) , name, body))
14
+ esc (connector_macro (__module__ , name, body))
15
15
end
16
16
17
17
struct Model{F, S}
51
51
52
52
function parse_variable_def! (dict, mod, arg, varclass)
53
53
MLStyle. @match arg begin
54
- :: Symbol => generate_var ( arg, varclass)
54
+ :: Symbol => generate_var! (dict, arg, varclass)
55
55
Expr (:call , a, b) => generate_var! (dict, a, set_iv! (dict, b), varclass)
56
56
Expr (:(= ), a, b) => begin
57
57
var = parse_variable_def! (dict, mod, a, varclass)
@@ -71,9 +71,23 @@ function parse_variable_def!(dict, mod, arg, varclass)
71
71
end
72
72
end
73
73
74
- generate_var (a) = Symbolics. variable (a)
74
+ function generate_var (a, varclass)
75
+ var = Symbolics. variable (a)
76
+ if varclass == :parameters
77
+ var = toparam (var)
78
+ end
79
+ var
80
+ end
81
+ function generate_var! (dict, a, varclass)
82
+ var = generate_var (a, :variables )
83
+ vd = get! (dict, varclass) do
84
+ Dict {Symbol, Dict{Symbol, Any}} ()
85
+ end
86
+ vd[a] = Dict {Symbol, Any} ()
87
+ var
88
+ end
75
89
function generate_var! (dict, a, b, varclass)
76
- iv = generate_var (b)
90
+ iv = generate_var (b, :variables )
77
91
prev_iv = get! (dict, :independent_variable ) do
78
92
iv
79
93
end
@@ -101,6 +115,7 @@ function parse_default(mod, a)
101
115
a = Base. remove_linenums! (deepcopy (a))
102
116
MLStyle. @match a begin
103
117
Expr (:block , a) => get_var (mod, a)
118
+ :: Symbol => get_var (mod, a)
104
119
_ => error (" Cannot parse default $a " )
105
120
end
106
121
end
@@ -121,49 +136,53 @@ function get_var(mod::Module, b)
121
136
b isa Symbol ? getproperty (mod, b) : b
122
137
end
123
138
macro model (name:: Symbol , expr)
124
- esc (model_macro (@__MODULE__ , name, expr))
139
+ esc (model_macro (__module__ , name, expr))
125
140
end
126
141
function model_macro (mod, name, expr)
127
142
exprs = Expr (:block )
128
143
dict = Dict {Symbol, Any} ()
144
+ comps = Symbol[]
145
+ vs = Symbol[]
146
+ ps = Symbol[]
147
+ eqs = Expr[]
129
148
for arg in expr. args
130
149
arg isa LineNumberNode && continue
131
150
arg. head == :macrocall || error (" $arg is not valid syntax. Expected a macro call." )
132
- parse_model! (exprs. args, dict, mod, arg)
151
+ parse_model! (exprs. args, comps, eqs, vs, ps, dict, mod, arg)
133
152
end
134
153
iv = get (dict, :independent_variable , nothing )
135
154
if iv === nothing
136
- error ( " $name doesn't have a independent variable" )
155
+ iv = dict[ :independent_variable ] = variable ( :t )
137
156
end
138
157
push! (exprs. args,
139
- :($ ODESystem (var"#___eqs___" , $ iv, var"#___vs___" , $ ([]) ;
140
- systems = var"#___comps___" , name)))
158
+ :($ ODESystem ($ Equation[ $ (eqs ... )] , $ iv, [ $ (vs ... )], [ $ (ps ... )] ;
159
+ systems = [ $ (comps ... )] , name)))
141
160
:($ name = $ Model ((; name) -> $ exprs, $ dict))
142
161
end
143
- function parse_model! (exprs, dict, mod, arg)
162
+ function parse_model! (exprs, comps, eqs, vs, ps, dict, mod, arg)
144
163
mname = arg. args[1 ]
145
- vs = Num[]
146
164
body = arg. args[end ]
147
165
if mname == Symbol (" @components" )
148
- parse_components! (exprs, dict, body)
166
+ parse_components! (exprs, comps, dict, body)
149
167
elseif mname == Symbol (" @variables" )
150
168
parse_variables! (exprs, vs, dict, mod, body, :variables )
169
+ elseif mname == Symbol (" @parameters" )
170
+ parse_variables! (exprs, ps, dict, mod, body, :parameters )
151
171
elseif mname == Symbol (" @equations" )
152
- parse_equations! (exprs, dict, body)
172
+ parse_equations! (exprs, eqs, dict, body)
153
173
else
154
174
error (" $mname is not handled." )
155
175
end
156
176
end
157
- function parse_components! (exprs, dict, body)
177
+ function parse_components! (exprs, cs, dict, body)
158
178
expr = Expr (:block )
159
179
push! (exprs, expr)
160
180
comps = Pair{String, String}[]
161
- names = Symbol[]
162
181
for arg in body. args
163
182
arg isa LineNumberNode && continue
164
183
MLStyle. @match arg begin
165
184
Expr (:(= ), a, b) => begin
166
- push! (names , a)
185
+ push! (cs , a)
167
186
arg = deepcopy (arg)
168
187
b = deepcopy (arg. args[2 ])
169
188
push! (b. args, Expr (:kw , :name , Meta. quot (a)))
@@ -174,32 +193,26 @@ function parse_components!(exprs, dict, body)
174
193
_ => error (" `@components` only takes assignment expressions. Got $arg " )
175
194
end
176
195
end
177
- push! (expr. args, :(var"#___comps___" = [$ (names... )]))
178
196
dict[:components ] = comps
179
197
end
180
198
function parse_variables! (exprs, vs, dict, mod, body, varclass)
181
199
expr = Expr (:block )
182
200
push! (exprs, expr)
183
- names = Symbol[]
184
201
for arg in body. args
185
202
arg isa LineNumberNode && continue
186
203
v = Num (parse_variable_def! (dict, mod, arg, varclass))
187
- push! (vs, v)
188
204
name = getname (v)
189
- push! (names , name)
205
+ push! (vs , name)
190
206
push! (expr. args, :($ name = $ v))
191
207
end
192
- push! (expr. args, :(var"#___vs___" = [$ (names... )]))
193
208
end
194
- function parse_equations! (exprs, dict, body)
195
- eqs = :(Equation[])
209
+ function parse_equations! (exprs, eqs, dict, body)
196
210
for arg in body. args
197
211
arg isa LineNumberNode && continue
198
- push! (eqs. args , arg)
212
+ push! (eqs, arg)
199
213
end
200
214
# TODO : does this work with TOML?
201
- dict[:equations ] = readable_code .(@view eqs. args[2 : end ])
202
- push! (exprs, :(var"#___eqs___" = $ eqs))
215
+ dict[:equations ] = readable_code .(eqs)
203
216
end
204
217
205
218
abstract type AbstractConnectorType end
0 commit comments