@@ -222,6 +222,96 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
222
222
varclass, where_types, meta)
223
223
return var, def, Dict ()
224
224
end
225
+ Expr (:tuple , Expr (:ref , a, b... ), y) => begin
226
+ varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
227
+ push! (kwargs, Expr (:kw , varname, nothing ))
228
+ if varclass == :parameters
229
+ var = :($ varname = $ first (@parameters $ a[$ (b... )] = ($ varname, $ y)))
230
+ else
231
+ var = :($ varname = $ first (@variables $ a[$ (b... )] = ($ varname, $ y)))
232
+ end
233
+ # TODO : update `dict` aka `Model.structure` with the metadata
234
+ (:($ varname... ), var), nothing , Dict ()
235
+ end
236
+ Expr (:(= ), Expr (:ref , a, b... ), y) => begin
237
+ varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
238
+ if Meta. isexpr (y, :tuple )
239
+ val, y = (y. args[1 ], y. args[2 : end ])
240
+ push! (kwargs, Expr (:kw , varname, nothing ))
241
+ if varclass == :parameters
242
+ var = :($ varname = $ varname === nothing ? $ val : $ varname;
243
+ $ varname = $ first (@parameters $ a[$ (b... )] = (
244
+ $ varname, $ (y... ))))
245
+ else
246
+ var = :($ varname = $ varname === nothing ? $ val : $ varname;
247
+ $ varname = $ first (@variables $ a[$ (b... )] = (
248
+ $ varname, $ (y... ))))
249
+ end
250
+ else
251
+ push! (kwargs, Expr (:kw , varname, nothing ))
252
+ if varclass == :parameters
253
+ var = :($ varname = $ varname === nothing ? $ y : $ varname; $ varname = $ first (@parameters $ a[$ (b... )] = $ varname))
254
+ else
255
+ var = :($ varname = $ varname === nothing ? $ y : $ varname; $ varname = $ first (@variables $ a[$ (b... )] = $ varname))
256
+ end
257
+ end
258
+ # TODO : update `dict`` aka `Model.structure` with the metadata
259
+ (:($ varname... ), var), nothing , Dict ()
260
+ end
261
+ Expr (:(= ), Expr (:(:: ), Expr (:ref , a, b... ), n), y) => begin
262
+ varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
263
+ if Meta. isexpr (y, :tuple )
264
+ val, y = (y. args[1 ], y. args[2 : end ])
265
+ push! (kwargs, Expr (:kw , varname, nothing ))
266
+ if varclass == :parameters
267
+ var = :(
268
+ $ varname = $ varname = $ varname === nothing ? $ val : $ varname;
269
+ $ varname = $ first (@parameters $ a[$ (b... )]:: $n = ($ varname, $ (y... )))
270
+ )
271
+ else
272
+ var = :($ varname = $ varname === nothing ? $ val : $ varname;
273
+ $ varname = $ first (@variables $ a[$ (b... )]:: $n = (
274
+ $ varname, $ (y... ))))
275
+ end
276
+ else
277
+ push! (kwargs, Expr (:kw , varname, y))
278
+ if varclass == :parameters
279
+ var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $n = $ varname))
280
+ else
281
+ var = :($ varname = $ first (@variables $ a[$ (b... )]:: $n = $ varname))
282
+ end
283
+ end
284
+ # TODO : update `dict`` aka `Model.structure` with the metadata
285
+ (:($ varname... ), var), nothing , Dict ()
286
+ end
287
+ Expr (:tuple , Expr (:(:: ), Expr (:ref , a, b... ), n), y) => begin
288
+ varname = Meta. isexpr (a, :call ) ? a. args[1 ] : a
289
+ push! (kwargs, Expr (:kw , varname, nothing ))
290
+ if varclass == :parameters
291
+ var = :($ varname = $ first (@parameters $ a[$ (b... )]:: $n = ($ varname, $ y)))
292
+ else
293
+ var = :($ varname = $ first (@variables $ a[$ (b... )]:: $n = ($ varname, $ y)))
294
+ end
295
+ # TODO : update `dict` aka `Model.structure` with the metadata
296
+ (:($ varname... ), var), nothing , Dict ()
297
+ end
298
+ Expr (:ref , a, b... ) => begin
299
+ varname = a isa Expr && a. head == :call ? a. args[1 ] : a
300
+ push! (kwargs, Expr (:kw , varname, nothing ))
301
+ if varclass == :parameters
302
+ var = :($ varname = $ first (@parameters $ a[$ (b... )] = $ varname))
303
+ elseif varclass == :variables
304
+ var = :($ varname = $ first (@variables $ a[$ (b... )] = $ varname))
305
+ else
306
+ throw (" Symbolic array with arbitrary length is not handled for $varclass .
307
+ Please open an issue with an example." )
308
+ end
309
+ dict[varclass] = get! (dict, varclass) do
310
+ Dict {Symbol, Dict{Symbol, Any}} ()
311
+ end
312
+ # dict[:kwargs][varname] = dict[varclass][varname] = Dict(:size => b)
313
+ (:($ varname... ), var), nothing , Dict ()
314
+ end
225
315
Expr (:(= ), a, b) => begin
226
316
Base. remove_linenums! (b)
227
317
def, meta = parse_default (mod, b)
@@ -268,14 +358,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
268
358
end
269
359
return var, def, Dict ()
270
360
end
271
- Expr (:ref , a, b... ) => begin
272
- if varclass == :parameters
273
- var = :($ a = $ first (@parameters $ a[$ (b... )]))
274
- else
275
- var = :($ a = $ first (@variables $ a[$ (b... )]))
276
- end
277
- (:($ a... ), var), nothing , Dict ()
278
- end
279
361
_ => error (" $arg cannot be parsed" )
280
362
end
281
363
end
677
759
function parse_variable_arg (dict, mod, arg, varclass, kwargs, where_types)
678
760
vv, def, metadata_with_exprs = parse_variable_def! (
679
761
dict, mod, arg, varclass, kwargs, where_types)
680
- if vv isa Tuple
681
- return vv
682
- else
683
- name = getname (vv[1 ])
684
-
762
+ if ! (vv isa Tuple)
763
+ name = getname (vv)
685
764
varexpr = if haskey (metadata_with_exprs, VariableUnit)
686
765
unit = metadata_with_exprs[VariableUnit]
687
766
quote
@@ -692,11 +771,11 @@ function parse_variable_arg(dict, mod, arg, varclass, kwargs, where_types)
692
771
$ setdefault ($ vv, $ convert_units ($ unit, $ name))
693
772
catch e
694
773
if isa (e, $ (DynamicQuantities. DimensionError)) ||
695
- isa (e, $ (Unitful. DimensionError))
774
+ isa (e, $ (Unitful. DimensionError))
696
775
error (" Unable to convert units for \' " * string (:($$ vv)) * " \' " )
697
776
elseif isa (e, MethodError)
698
777
error (" No or invalid units provided for \' " * string (:($$ vv)) *
699
- " \' " )
778
+ " \' " )
700
779
else
701
780
rethrow (e)
702
781
end
@@ -721,6 +800,8 @@ function parse_variable_arg(dict, mod, arg, varclass, kwargs, where_types)
721
800
722
801
push! (varexpr. args, metadata_expr)
723
802
return vv isa Num ? name : :($ name... ), varexpr
803
+ else
804
+ return vv
724
805
end
725
806
end
726
807
0 commit comments