1111
1212function buildpolyvar (:: Type{PV} , var) where {PV}
1313 if isa (var, Symbol)
14- :($ (esc (var)) = $ PV ($ " $var " ))
14+ var, :($ (esc (var)) = $ PV ($ " $var " ))
1515 else
1616 isa (var, Expr) || error (" Expected $var to be a variable name" )
1717 Base. Meta. isexpr (var, :ref ) || error (" Expected $var to be of the form varname[idxset]" )
@@ -20,21 +20,35 @@ function buildpolyvar(::Type{PV}, var) where {PV}
2020 prefix = string (var. args[1 ])
2121 if length (var. args) == 2
2222 idxset = esc (var. args[2 ])
23- :($ (esc (varname)) = polyvecvar ($ PV, $ prefix, $ idxset))
23+ varname, :($ (esc (varname)) = polyvecvar ($ PV, $ prefix, $ idxset))
2424 else
2525 rowidxset = esc (var. args[2 ])
2626 colidxset = esc (var. args[3 ])
27- :($ (esc (varname)) = polymatrixvar ($ PV, $ prefix, $ rowidxset, $ colidxset))
27+ varname, :($ (esc (varname)) = polymatrixvar ($ PV, $ prefix, $ rowidxset, $ colidxset))
2828 end
2929 end
3030end
3131
32+ function buildpolyvars (:: Type{PV} , args) where {PV}
33+ vars = Symbol[]
34+ exprs = []
35+ for arg in args
36+ var, expr = buildpolyvar (PV, arg)
37+ push! (vars, var)
38+ push! (exprs, expr)
39+ end
40+ vars, exprs
41+ end
42+
3243# Variable vector x returned garanteed to be sorted so that if p is built with x then vars(p) == x
3344macro polyvar (args... )
34- reduce ((x,y) -> :($ x; $ y), [buildpolyvar (PolyVar{true }, arg) for arg in args], init= :())
45+ vars, exprs = buildpolyvars (PolyVar{true }, args)
46+ :($ (foldl ((x,y) -> :($ x; $ y), exprs, init= :())); $ (Expr (:tuple , esc .(vars)... )))
3547end
48+
3649macro ncpolyvar (args... )
37- reduce ((x,y) -> :($ x; $ y), [buildpolyvar (PolyVar{false }, arg) for arg in args], init= :())
50+ vars, exprs = buildpolyvars (PolyVar{false }, args)
51+ :($ (foldl ((x,y) -> :($ x; $ y), exprs, init= :())); $ (Expr (:tuple , esc .(vars)... )))
3852end
3953
4054struct PolyVar{C} <: AbstractVariable
0 commit comments