11
11
12
12
function buildpolyvar (:: Type{PV} , var) where {PV}
13
13
if isa (var, Symbol)
14
- :($ (esc (var)) = $ PV ($ " $var " ))
14
+ var, :($ (esc (var)) = $ PV ($ " $var " ))
15
15
else
16
16
isa (var, Expr) || error (" Expected $var to be a variable name" )
17
17
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}
20
20
prefix = string (var. args[1 ])
21
21
if length (var. args) == 2
22
22
idxset = esc (var. args[2 ])
23
- :($ (esc (varname)) = polyvecvar ($ PV, $ prefix, $ idxset))
23
+ varname, :($ (esc (varname)) = polyvecvar ($ PV, $ prefix, $ idxset))
24
24
else
25
25
rowidxset = esc (var. args[2 ])
26
26
colidxset = esc (var. args[3 ])
27
- :($ (esc (varname)) = polymatrixvar ($ PV, $ prefix, $ rowidxset, $ colidxset))
27
+ varname, :($ (esc (varname)) = polymatrixvar ($ PV, $ prefix, $ rowidxset, $ colidxset))
28
28
end
29
29
end
30
30
end
31
31
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
+
32
43
# Variable vector x returned garanteed to be sorted so that if p is built with x then vars(p) == x
33
44
macro 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)... )))
35
47
end
48
+
36
49
macro 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)... )))
38
52
end
39
53
40
54
struct PolyVar{C} <: AbstractVariable
0 commit comments