Dear Julia users,
The usage of the @inbounds macro is not explained the manual, and its
syntax appears to be strange. Consider the three functions at the end of
this posting. Only the third one works -- why?
In general, I think @inbounds is broken. Besides the weird syntax, it has
two other issues. First, there is no way to apply the macro to one
subscript operation but not another in a long expression (as far as I
know). Second, it is not extensible in the sense that if programmer A
implements his/her own array-like structure with his/her own getindex and
setindex operations, he/she might like to have two versions of
getindex/setindex, one safe/slower and the other unsafe/faster, but there
is no way for programmer A to detect whether user B, a user of his/her new
array-like structure, has requested @inbounds or not.
I would like to propose the following replacement for @inbounds, which
solves all three problems. Instead of a macro, there should be two
different subscript operations, say a[1] and a[$ 1 $], where the first is
safe/slow and the second is unsafe/fast. The compiler will compile the
first as getindex/setindex and the second as getindexUnsafe/setindexUnsafe.
-- Steve Vavasis
function sqrtfirst{T}(a::Array{T, 1})
@assert(size(a,1) >= 1)
@inbounds sqrt(a[1])
end
function sqrtfirst{T}(a::Array{T, 1})
@assert(size(a,1) >= 1)
return @inbounds sqrt(a[1])
end
function sqrtfirst{T}(a::Array{T, 1})
@assert(size(a,1) >= 1)
@inbounds return sqrt(a[1])
end