Skip to content

Commit f31c81d

Browse files
authored
Merge pull request #33 from JuliaAlgebra/improve-polyvar
Improve @PolyVar (2)
2 parents 2e7cdc8 + e8f8975 commit f31c81d

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/var.jl

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ end
1111

1212
function 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
3030
end
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
3344
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)...)))
3547
end
48+
3649
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)...)))
3852
end
3953

4054
struct PolyVar{C} <: AbstractVariable

test/mono.jl

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@testset "PolyVar and Monomial tests" begin
2-
@testset "polyvar macro index set" begin
2+
@testset "PolyVar macro index set" begin
33
n = 3
44
@polyvar x[1:n] y z[1:n-1] u[1:n,1:n-1]
55
@test x isa Vector{PolyVar{true}}
@@ -12,6 +12,16 @@
1212
@test x[1] > x[2] > x[3] > y > z[1] > z[2]
1313
@test u[1, 1] > u[2, 1] > u[2, 2]
1414
end
15+
@testset "PolyVar macro tuple return" begin
16+
vars = @polyvar x y z
17+
@test vars isa Tuple
18+
@test vars == (x, y, z)
19+
20+
vars = @ncpolyvar x y z
21+
@test vars isa Tuple
22+
@test vars == (x, y, z)
23+
end
24+
1525
@testset "PolyVar" begin
1626
@test zeroterm(PolyVar{true}) == 0
1727
@test zero(PolyVar{true}) == 0

0 commit comments

Comments
 (0)