Skip to content

Commit 43b0f6a

Browse files
authored
Resolve the identifier conflicts in @SArray (#1043)
* Resolve the identifier conflicts in `@SArray` * Avoid unneeded excape. * Add test The function name is somehow random though.
1 parent d5c3c96 commit 43b0f6a

File tree

7 files changed

+56
-44
lines changed

7 files changed

+56
-44
lines changed

src/MArray.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ A convenience macro to construct `MArray` with arbitrary dimension.
6060
See [`@SArray`](@ref) for detailed features.
6161
"""
6262
macro MArray(ex)
63-
esc(static_array_gen(MArray, ex, __module__))
63+
static_array_gen(MArray, ex, __module__)
6464
end
6565

6666
function promote_rule(::Type{<:MArray{S,T,N,L}}, ::Type{<:MArray{S,U,N,L}}) where {S,T,U,N,L}

src/MMatrix.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ A convenience macro to construct `MMatrix`.
2424
See [`@SArray`](@ref) for detailed features.
2525
"""
2626
macro MMatrix(ex)
27-
esc(static_matrix_gen(MMatrix, ex, __module__))
27+
static_matrix_gen(MMatrix, ex, __module__)
2828
end

src/MVector.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ A convenience macro to construct `MVector`.
1414
See [`@SArray`](@ref) for detailed features.
1515
"""
1616
macro MVector(ex)
17-
esc(static_vector_gen(MVector, ex, __module__))
17+
static_vector_gen(MVector, ex, __module__)
1818
end
1919

2020
# Named field access for the first four elements, using the conventional field

src/SArray.jl

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -142,21 +142,22 @@ function parse_cat_ast(ex::Expr)
142142
cat_any(Val(maxdim), Val(catdim), nargs)
143143
end
144144

145+
escall(args) = Iterators.map(esc, args)
145146
function static_array_gen(::Type{SA}, @nospecialize(ex), mod::Module) where {SA}
146147
if !isa(ex, Expr)
147148
error("Bad input for @$SA")
148149
end
149150
head = ex.head
150151
if head === :vect # vector
151-
return :($SA{Tuple{$(length(ex.args))}}(tuple($(ex.args...))))
152+
return :($SA{$Tuple{$(length(ex.args))}}($tuple($(escall(ex.args)...))))
152153
elseif head === :ref # typed, vector
153-
return :($SA{Tuple{$(length(ex.args)-1)},$(ex.args[1])}(tuple($(ex.args[2:end]...))))
154+
return :($SA{$Tuple{$(length(ex.args)-1)},$(esc(ex.args[1]))}($tuple($(escall(ex.args[2:end])...))))
154155
elseif head === :typed_vcat || head === :typed_hcat || head === :typed_ncat # typed, cat
155156
args = parse_cat_ast(ex)
156-
return :($SA{Tuple{$(size(args)...)},$(ex.args[1])}(tuple($(args...))))
157+
return :($SA{$Tuple{$(size(args)...)},$(esc(ex.args[1]))}($tuple($(escall(args)...))))
157158
elseif head === :vcat || head === :hcat || head === :ncat # untyped, cat
158159
args = parse_cat_ast(ex)
159-
return :($SA{Tuple{$(size(args)...)}}(tuple($(args...))))
160+
return :($SA{$Tuple{$(size(args)...)}}($tuple($(escall(args)...))))
160161
elseif head === :comprehension
161162
if length(ex.args) != 1 || !isa(ex.args[1], Expr) || ex.args[1].head != :generator
162163
error("Expected generator in comprehension, e.g. [f(i,j) for i = 1:3, j = 1:3]")
@@ -167,42 +168,44 @@ function static_array_gen(::Type{SA}, @nospecialize(ex), mod::Module) where {SA}
167168
rngs = Any[Core.eval(mod, ex.args[i+1].args[2]) for i = 1:n_rng]
168169
exprs = (:(f($(j...))) for j in Iterators.product(rngs...))
169170
return quote
170-
let f($(rng_args...)) = $(ex.args[1])
171-
$SA{Tuple{$(size(exprs)...)}}(tuple($(exprs...)))
171+
let
172+
f($(escall(rng_args)...)) = $(esc(ex.args[1]))
173+
$SA{$Tuple{$(size(exprs)...)}}($tuple($(exprs...)))
172174
end
173175
end
174176
elseif head === :typed_comprehension
175177
if length(ex.args) != 2 || !isa(ex.args[2], Expr) || ex.args[2].head != :generator
176178
error("Expected generator in typed comprehension, e.g. Float64[f(i,j) for i = 1:3, j = 1:3]")
177179
end
178-
T = ex.args[1]
180+
T = esc(ex.args[1])
179181
ex = ex.args[2]
180182
n_rng = length(ex.args) - 1
181183
rng_args = (ex.args[i+1].args[1] for i = 1:n_rng)
182184
rngs = Any[Core.eval(mod, ex.args[i+1].args[2]) for i = 1:n_rng]
183185
exprs = (:(f($(j...))) for j in Iterators.product(rngs...))
184186
return quote
185-
let f($(rng_args...)) = $(ex.args[1])
186-
$SA{Tuple{$(size(exprs)...)},$T}(tuple($(exprs...)))
187+
let
188+
f($(escall(rng_args)...)) = $(esc(ex.args[1]))
189+
$SA{$Tuple{$(size(exprs)...)},$T}($tuple($(exprs...)))
187190
end
188191
end
189192
elseif head === :call
190193
f = ex.args[1]
191194
if f === :zeros || f === :ones || f === :rand || f === :randn || f === :randexp
192195
if length(ex.args) == 1
193196
f === :zeros || f === :ones || error("@$SA got bad expression: $(ex)")
194-
return :($f($SA{Tuple{},Float64}))
197+
return :($f($SA{$Tuple{},$Float64}))
195198
end
196199
return quote
197-
if isa($(ex.args[2]), DataType)
198-
$f($SA{Tuple{$(ex.args[3:end]...)},$(ex.args[2])})
200+
if isa($(esc(ex.args[2])), DataType)
201+
$f($SA{$Tuple{$(escall(ex.args[3:end])...)},$(esc(ex.args[2]))})
199202
else
200-
$f($SA{Tuple{$(ex.args[2:end]...)}})
203+
$f($SA{$Tuple{$(escall(ex.args[2:end])...)}})
201204
end
202205
end
203206
elseif f === :fill
204207
length(ex.args) == 1 && error("@$SA got bad expression: $(ex)")
205-
return :($f($(ex.args[2]), $SA{Tuple{$(ex.args[3:end]...)}}))
208+
return :($f($(esc(ex.args[2])), $SA{$Tuple{$(escall(ex.args[3:end])...)}}))
206209
else
207210
error("@$SA only supports the zeros(), ones(), fill(), rand(), randn(), and randexp() functions.")
208211
end
@@ -235,7 +238,7 @@ It supports:
235238
Only support `zeros()`, `ones()`, `fill()`, `rand()`, `randn()`, and `randexp()`
236239
"""
237240
macro SArray(ex)
238-
esc(static_array_gen(SArray, ex, __module__))
241+
static_array_gen(SArray, ex, __module__)
239242
end
240243

241244
function promote_rule(::Type{<:SArray{S,T,N,L}}, ::Type{<:SArray{S,U,N,L}}) where {S,T,U,N,L}

src/SMatrix.jl

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ function static_matrix_gen(::Type{SM}, @nospecialize(ex), mod::Module) where {SM
2121
end
2222
head = ex.head
2323
if head === :vect && length(ex.args) == 1 # 1 x 1
24-
return :($SM{1,1}(tuple($(ex.args[1]))))
24+
return :($SM{1,1}($tuple($(esc(ex.args[1])))))
2525
elseif head === :ref && length(ex.args) == 2 # typed, 1 x 1
26-
return :($SM{1,1,$(ex.args[1])}(tuple($(ex.args[2]))))
26+
return :($SM{1,1,$(esc(ex.args[1]))}($tuple($(esc(ex.args[2])))))
2727
elseif head === :typed_vcat || head === :typed_hcat || head === :typed_ncat # typed, cat
2828
args = parse_cat_ast(ex)
2929
sz1, sz2 = check_matrix_size(size(args))
30-
return :($SM{$sz1,$sz2,$(ex.args[1])}(tuple($(args...))))
30+
return :($SM{$sz1,$sz2,$(esc(ex.args[1]))}($tuple($(escall(args)...))))
3131
elseif head === :vcat || head === :hcat || head === :ncat # untyped, cat
3232
args = parse_cat_ast(ex)
3333
sz1, sz2 = check_matrix_size(size(args))
34-
return :($SM{$sz1,$sz2}(tuple($(args...))))
34+
return :($SM{$sz1,$sz2}($tuple($(escall(args)...))))
3535
elseif head === :comprehension
3636
if length(ex.args) != 1 || !isa(ex.args[1], Expr) || (ex.args[1]::Expr).head != :generator
3737
error("Expected generator in comprehension, e.g. [f(i,j) for i = 1:3, j = 1:3]")
@@ -44,15 +44,16 @@ function static_matrix_gen(::Type{SM}, @nospecialize(ex), mod::Module) where {SM
4444
rng2 = Core.eval(mod, ex.args[3].args[2])
4545
exprs = (:(f($j1, $j2)) for j1 in rng1, j2 in rng2)
4646
return quote
47-
let f($(ex.args[2].args[1]), $(ex.args[3].args[1])) = $(ex.args[1])
48-
$SM{$(length(rng1)),$(length(rng2))}(tuple($(exprs...)))
47+
let
48+
f($(esc(ex.args[2].args[1])), $(esc(ex.args[3].args[1]))) = $(esc(ex.args[1]))
49+
$SM{$(length(rng1)),$(length(rng2))}($tuple($(exprs...)))
4950
end
5051
end
5152
elseif head === :typed_comprehension
5253
if length(ex.args) != 2 || !isa(ex.args[2], Expr) || (ex.args[2]::Expr).head != :generator
5354
error("Expected generator in typed comprehension, e.g. Float64[f(i,j) for i = 1:3, j = 1:3]")
5455
end
55-
T = ex.args[1]
56+
T = esc(ex.args[1])
5657
ex = ex.args[2]
5758
if length(ex.args) != 3
5859
error("Use a 2-dimensional comprehension for @$SM")
@@ -61,23 +62,24 @@ function static_matrix_gen(::Type{SM}, @nospecialize(ex), mod::Module) where {SM
6162
rng2 = Core.eval(mod, ex.args[3].args[2])
6263
exprs = (:(f($j1, $j2)) for j1 in rng1, j2 in rng2)
6364
return quote
64-
let f($(ex.args[2].args[1]), $(ex.args[3].args[1])) = $(ex.args[1])
65-
$SM{$(length(rng1)),$(length(rng2)),$T}(tuple($(exprs...)))
65+
let
66+
f($(esc(ex.args[2].args[1])), $(esc(ex.args[3].args[1]))) = $(esc(ex.args[1]))
67+
$SM{$(length(rng1)),$(length(rng2)),$T}($tuple($(exprs...)))
6668
end
6769
end
6870
elseif head === :call
6971
f = ex.args[1]
7072
if f === :zeros || f === :ones || f === :rand || f === :randn || f === :randexp
7173
if length(ex.args) == 3
72-
return :($f($SM{$(ex.args[2:3]...)}))
74+
return :($f($SM{$(escall(ex.args[2:3])...)}))
7375
elseif length(ex.args) == 4
74-
return :($f($SM{$(ex.args[[3,4,2]]...)}))
76+
return :($f($SM{$(escall(ex.args[[3,4,2]])...)}))
7577
else
7678
error("@$SM expected a 2-dimensional array expression")
7779
end
7880
elseif ex.args[1] === :fill
7981
if length(ex.args) == 4
80-
return :($f($(ex.args[2]), $SM{$(ex.args[3:4]...)}))
82+
return :($f($(esc(ex.args[2])), $SM{$(escall(ex.args[3:4])...)}))
8183
else
8284
error("@$SM expected a 2-dimensional array expression")
8385
end
@@ -100,5 +102,5 @@ A convenience macro to construct `SMatrix`.
100102
See [`@SArray`](@ref) for detailed features.
101103
"""
102104
macro SMatrix(ex)
103-
esc(static_matrix_gen(SMatrix, ex, __module__))
105+
static_matrix_gen(SMatrix, ex, __module__)
104106
end

src/SVector.jl

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,17 @@ function static_vector_gen(::Type{SV}, @nospecialize(ex), mod::Module) where {SV
2727
end
2828
head = ex.head
2929
if head === :vect
30-
return :($SV{$(length(ex.args))}(tuple($(ex.args...))))
30+
return :($SV{$(length(ex.args))}($tuple($(escall(ex.args)...))))
3131
elseif head === :ref
32-
return :($SV{$(length(ex.args)-1),$(ex.args[1])}(tuple($(ex.args[2:end]...))))
32+
return :($SV{$(length(ex.args)-1),$(esc(ex.args[1]))}($tuple($(escall(ex.args[2:end])...))))
3333
elseif head === :typed_vcat || head === :typed_hcat || head === :typed_ncat # typed, cat
3434
args = parse_cat_ast(ex)
3535
len = check_vector_length(size(args))
36-
return :($SV{$len,$(ex.args[1])}(tuple($(args...))))
36+
return :($SV{$len,$(esc(ex.args[1]))}($tuple($(escall(args)...))))
3737
elseif head === :vcat || head === :hcat || head === :ncat # untyped, cat
3838
args = parse_cat_ast(ex)
3939
len = check_vector_length(size(args))
40-
return :($SV{$len}(tuple($(args...))))
40+
return :($SV{$len}($tuple($(escall(args)...))))
4141
elseif head === :comprehension
4242
if length(ex.args) != 1 || !isa(ex.args[1], Expr) || ex.args[1].head != :generator
4343
error("Expected generator in comprehension, e.g. [f(i) for i = 1:3]")
@@ -49,39 +49,41 @@ function static_vector_gen(::Type{SV}, @nospecialize(ex), mod::Module) where {SV
4949
rng = Core.eval(mod, ex.args[2].args[2])
5050
exprs = (:(f($j)) for j in rng)
5151
return quote
52-
let f($(ex.args[2].args[1])) = $(ex.args[1])
53-
$SV{$(length(rng))}(tuple($(exprs...)))
52+
let
53+
f($(esc(ex.args[2].args[1]))) = $(esc(ex.args[1]))
54+
$SV{$(length(rng))}($tuple($(exprs...)))
5455
end
5556
end
5657
elseif head === :typed_comprehension
5758
if length(ex.args) != 2 || !isa(ex.args[2], Expr) || ex.args[2].head != :generator
5859
error("Expected generator in typed comprehension, e.g. Float64[f(i) for i = 1:3]")
5960
end
60-
T = ex.args[1]
61+
T = esc(ex.args[1])
6162
ex = ex.args[2]
6263
if length(ex.args) != 2
6364
error("Use a one-dimensional comprehension for @$SV")
6465
end
6566
rng = Core.eval(mod, ex.args[2].args[2])
6667
exprs = (:(f($j)) for j in rng)
6768
return quote
68-
let f($(ex.args[2].args[1])) = $(ex.args[1])
69-
$SV{$(length(rng)),$T}(tuple($(exprs...)))
69+
let
70+
f($(esc(ex.args[2].args[1]))) = $(esc(ex.args[1]))
71+
$SV{$(length(rng)),$T}($tuple($(exprs...)))
7072
end
7173
end
7274
elseif head === :call
7375
f = ex.args[1]
7476
if f === :zeros || f === :ones || f === :rand || f === :randn || f === :randexp
7577
if length(ex.args) == 2
76-
return :($f($SV{$(ex.args[2])}))
78+
return :($f($SV{$(esc(ex.args[2]))}))
7779
elseif length(ex.args) == 3
78-
return :($f($SV{$(ex.args[3:-1:2]...)}))
80+
return :($f($SV{$(escall(ex.args[3:-1:2])...)}))
7981
else
8082
error("@$SV expected a 1-dimensional array expression")
8183
end
8284
elseif ex.args[1] === :fill
8385
if length(ex.args) == 3
84-
return :($f($(ex.args[2]), $SV{$(ex.args[3])}))
86+
return :($f($(esc(ex.args[2])), $SV{$(esc(ex.args[3]))}))
8587
else
8688
error("@$SV expected a 1-dimensional array expression")
8789
end
@@ -102,6 +104,6 @@ A convenience macro to construct `SVector`.
102104
See [`@SArray`](@ref) for detailed features.
103105
"""
104106
macro SVector(ex)
105-
esc(static_vector_gen(SVector, ex, __module__))
107+
static_vector_gen(SVector, ex, __module__)
106108
end
107109

test/SVector.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,9 @@
122122
@test_throws ErrorException v2.z
123123
@test_throws ErrorException v2.w
124124
end
125+
126+
@testset "issue 1042" begin
127+
f = [1,2,3]
128+
@test f == @SVector [f[i] for i in 1:3]
129+
end
125130
end

0 commit comments

Comments
 (0)