julia> f() = missing <= 2 <= 3
f (generic function with 1 method)
julia> @code_lowered f()
CodeInfo(
1 ─ %1 = Main.missing <= 2
└── goto #3 if not %1
2 ─ %3 = 2 <= 3
└── return %3
3 ─ return false
)
julia> f()
ERROR: TypeError: non-boolean (Missing) used in boolean contextStacktrace:
[1] f() @ Main .\REPL[19]:1
[2] top-level scope @ REPL[21]:1
Chained comparisons “use the && operator for scalar comparisons”. This means that your code is equivalent to something like:
missing <= 2 && 2 <= 3
which fails because the && short-circuit operator cannot handle missing.
Just explicitly write it out and use &, ala (missing <= 2) & (2 <= 3). Note that parentheses are needed because & has higher precedence than <=.
Of course… I’ve seen it, too much syntax lets me forget meaning.
I see why it doesn’t work and how to prevent it. But shouldn’t we fix it? Seems inconsistent
It seems like fixing it would require changing chained comparisons to use & instead of &&. This has been discussed previously in
and the conclusion by @jeff.bezanson in the latter issue was:
Unfortunately I don’t see a non-breaking way to implement this.
which means it will have to wait until 2.0 (if ever)?
Can you file an issue at MissingsAsFalse.jl? Currently the @mfalse macro does not support this chained comparison, but it would be a good addition.