Why isn't there a `!in` or `!∈` function/operator?

I have encountered the absence of an !∈ or !in operator many times now and my muscle memory insists on telling me that it should exist:

if a !in (b, c, d)
  ...
end

Why isn’t there an analogous operator/function for this very idiomatic construct? IMHO, it is much, much clearer to understand and process than writing

if !(a in (b, c, d))
  ...
end

and intuitively it wouldn’t be slower either. Was this a conscious decision to not have the negation of in/ or are there other reasons?

2 Likes

You could use ∉ = \notin <TAB>.

4 Likes

Ah, I didn’t know about that! Good point, but isn’t there anything for people who cannot use non-ASCII characters? It seems weird that there is an imbalance with existing but !in not?

This is an old debate, see e.g.

1 Like

There’s the functional form that you may use, rather than a binary operator:

julia> !in(2, 1:3)
false
1 Like

True, but this is still a lot less legible than !in and doesn’t really explain why there is this asymmetry in the first place.

Related github issue: ! for infix operators · Issue #25512 · JuliaLang/julia · GitHub

One of the main problems mentioned in that issue is that the negated version of == isn’t !==, but !=. (And the same with === vs !==)

Aside from that, it would probably be possible to just let a !<op> b be the same as !(a <op> b) for any infix operator <op>.

1 Like

I agree that there is merit in finding a general solution. However, I think in is somewhat special as there already exists a non-ASCII equivalent, so to me it is not understandable why !in is not treated the same way.