@@ -222,6 +222,96 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
222222                varclass, where_types, meta)
223223            return  var, def, Dict ()
224224        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 
225315        Expr (:(= ), a, b) =>  begin 
226316            Base. remove_linenums! (b)
227317            def, meta =  parse_default (mod, b)
@@ -268,14 +358,6 @@ function parse_variable_def!(dict, mod, arg, varclass, kwargs, where_types;
268358            end 
269359            return  var, def, Dict ()
270360        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 
279361        _ =>  error (" $arg  cannot be parsed" 
280362    end 
281363end 
677759function  parse_variable_arg (dict, mod, arg, varclass, kwargs, where_types)
678760    vv, def, metadata_with_exprs =  parse_variable_def! (
679761        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)
685764        varexpr =  if  haskey (metadata_with_exprs, VariableUnit)
686765            unit =  metadata_with_exprs[VariableUnit]
687766            quote 
@@ -692,11 +771,11 @@ function parse_variable_arg(dict, mod, arg, varclass, kwargs, where_types)
692771                        $ setdefault ($ vv, $ convert_units ($ unit, $ name))
693772                    catch  e
694773                        if  isa (e, $ (DynamicQuantities. DimensionError)) || 
695-                         isa (e, $ (Unitful. DimensionError))
774+                             isa (e, $ (Unitful. DimensionError))
696775                            error (" Unable to convert units for \' " *  string (:($$ vv)) *  " \' " 
697776                        elseif  isa (e, MethodError)
698777                            error (" No or invalid units provided for \' " *  string (:($$ vv)) * 
699-                                 " \' " 
778+                                    " \' " 
700779                        else 
701780                            rethrow (e)
702781                        end 
@@ -721,6 +800,8 @@ function parse_variable_arg(dict, mod, arg, varclass, kwargs, where_types)
721800
722801        push! (varexpr. args, metadata_expr)
723802        return  vv isa  Num ?  name :  :($ name... ), varexpr
803+     else 
804+         return  vv
724805    end 
725806end 
726807
0 commit comments