A question was posted about chained comparison operators and how they are interpreted in different languages.
Chaining comparison operators means that (x < y < z)
would be interpreted as ((x < y) && (y < z))
instead of as ((x < y) < z)
.
The comments on that question show that Python, Perl 6, and Mathematica support chaining comparison operators, but what other languages support this feature and why is it not more common?
A quick look at the Python documentation shows that this feature has been since at least 1996. Is there a reason more languages have not added this syntax?
A statically typed language would have problems with type conversion, but are there other reasons this is not more common?
It should be more common, but I suspect it is not because it makes parsing languages more complex.
Benefits:
- Upholds the principle of least surprise
- Reads like math is taught
- Reduces cognitive load (see previous 2 points)
Drawbacks:
- Grammar is more complex for the language
- Special case syntactic sugar
As to why not, my guesses are:
- Language author(s) didn't think of it
- Is on the 'nice to have' list
- Was decided that it wasn't useful enough to justify implementing
The benefit is too small to justify complicating the language.
You don't need it that often, and it is easy to get the same effect cleanly with a few characters more.
Scheme (and probably most other Lisp family languages) supports multiple comparison efficiently within its grammar:
(< x y z)
This can be considered an ordinary function application of the <
function with three arguments. See 6.2.5 Numerical Operations in the specification.
Clojure supports chained comparison too.
Chained comparison is a feature of BCPL, since the late 1960s.
I think ICON is the original language to have this, and in ICON it falls out of the way that booleans are handled as special 'fail' tags with all other values being treated as true.