this doesn't matter for simple expressions like this, but kinda hurts when you need readable nested if statements:
julia> function divrem(x::Integer, y::Integer, rnd::typeof(RoundNearest)) # parse error
(q, r) = divrem(x, y)
parity = isodd(y) | iseven(q)
x >= 0 ? y >= 0 ? r >= (y÷2) + parity ? (q+true, r-y) : (q, r)
: r >= -(y÷2) + parity ? (q-true, r+y) : (q, r)
: y >= 0 ? r <= -signed(y÷2) - parity ? (q-true, r+y) : (q, r)
: r <= (y÷2) - parity ? (q+true, r-y) : (q, r)
end
julia> function divrem(x::Integer, y::Integer, rnd::typeof(RoundNearest)) # workaround
(q, r) = divrem(x, y)
parity = isodd(y) | iseven(q)
(
x >= 0 ? y >= 0 ? r >= (y÷2) + parity ? (q+true, r-y) : (q, r)
: r >= -(y÷2) + parity ? (q-true, r+y) : (q, r)
: y >= 0 ? r <= -signed(y÷2) - parity ? (q-true, r+y) : (q, r)
: r <= (y÷2) - parity ? (q+true, r-y) : (q, r)
)
end
julia> function divrem(x::Integer, y::Integer, rnd::typeof(RoundNearest)) # alternate workaround, harder to read
(q, r) = divrem(x, y)
parity = isodd(y) | iseven(q)
x >= 0 ? y >= 0 ? r >= (y÷2) + parity ? (q+true, r-y) : (q, r) :
r >= -(y÷2) + parity ? (q-true, r+y) : (q, r) :
y >= 0 ? r <= -signed(y÷2) - parity ? (q-true, r+y) : (q, r) :
r <= (y÷2) - parity ? (q+true, r-y) : (q, r)
end
julia> function divrem(x::Integer, y::Integer, rnd::typeof(RoundNearest)) # unreadable abomination from Base
(q, r) = divrem(x, y)
if x >= 0
if y >= 0
r >= (y÷2) + (isodd(y) | iseven(q)) ? (q+true, r-y) : (q, r)
else
r >= -(y÷2) + (isodd(y) | iseven(q)) ? (q-true, r+y) : (q, r)
end
else
if y >= 0
r <= -signed(y÷2) - (isodd(y) | iseven(q)) ? (q-true, r+y) : (q, r)
else
r <= (y÷2) - (isodd(y) | iseven(q)) ? (q+true, r-y) : (q, r)
end
end
end
julia> function divrem(x::Integer, y::Integer, rnd::typeof(RoundNearest)) # trololololol
if x >= 0
if y >= 0
if r >= (y÷2) + (isodd(y) | iseven(q))
divrem(x, y) .+ (true, -y)
else
divrem(x, y)
end
else
if r >= -(y÷2) + (isodd(y) | iseven(q))
divrem(x, y) .- (true, -y)
else
divrem(x, y)
end
end
else
if y >= 0
if r <= -signed(y÷2) - (isodd(y) | iseven(q))
divrem(x, y) .- (true, -y)
else
divrem(x, y)
end
else
if r <= (y÷2) - (isodd(y) | iseven(q))
divrem(x, y) .+ (true, -y)
else
divrem(x, y)
end
end
end
end
julia> function divrem(x::Integer, y::Integer, rnd::typeof(RoundNearest)) # also technically equivalent
if x >= 0
if y >= 0
if r >= (y÷2) + (isodd(y) | iseven(q))
divrem(x, y) .+ (true, -y)
else
divrem(x, y)
end
elseif r >= -(y÷2) + (isodd(y) | iseven(q))
divrem(x, y) .- (true, -y)
else
divrem(x, y)
end
elseif y >= 0
if r <= -signed(y÷2) - (isodd(y) | iseven(q))
divrem(x, y) .- (true, -y)
else
divrem(x, y)
end
elseif r <= (y÷2) - (isodd(y) | iseven(q))
divrem(x, y) .+ (true, -y)
else
divrem(x, y)
end
end
if you have the
:of?:on the second line, it fails to parse correctly:this doesn't matter for simple expressions like this, but kinda hurts when you need readable nested if statements:
(those
(y÷2)'s should prob all be(y÷0x2)'s so that it doesn't need to cast y for the division, but that's a totally different tangent)