[swift-evolution] [Proposal] Invert the order of pattern match operator
Dave Abrahams
dabrahams at apple.com
Thu Apr 7 13:16:00 CDT 2016
on Thu Apr 07 2016, David Owens II <swift-evolution at swift.org> wrote:
> It would be nice to know the rationale behind the choice of the current syntax.
> I agree that these seem more natural:
>
> @warn_unused_result
> public func ~=<I : ForwardIndexType where I : Comparable>(value: I, pattern:
> Range<I>) -> Bool
>
> @warn_unused_result
> public func ~=<I : IntervalType>(value: I.Bound, pattern: I) -> Bool
+1
> I would not change from `~=` to `=~` though.
One downside with `~=` is that it reads like `+=`, which mutates the
LHS. Of course, `=~` has its own issues, e.g. `x=~y` might read as `x =
~y`.
> So you have this:
>
> let x = 4
>
> switch x {
> case let v where x ~= 0...5: print("matched: \(v)")
> default: print("nothing!!")
> }
>
> -David
>
> On Apr 7, 2016, at 4:57 AM, David Rodrigues via swift-evolution
> <swift-evolution at swift.org> wrote:
>
> Hi all,
>
> Swift has a pattern match operator, ~=, which is unknown to many (like me
> until a few weeks ago), that performs a match between a value and a certain
> pattern, e.g. checking if an integer value is contained in a range of
> integers.
>
> This operator may be little known, but it plays a key role in the language
> since it's used behind the scenes to support expression patterns in `switch
> ` statement case labels, which we all know are extremely popular.
>
> let point = (2, 4)
> switch point {
> case (0, 0):
> print("The point is at the origin")
> case (0...4, 0...4):
> print("The point is in the subregion")
> default:
> break
> }
>
> Most of the time we don't use the operator directly but it is available and
> can be handy in certain conditions.
>
> let point = (2, 4)
> switch point {
> case (let x, let y) where 0...4 ~= x && 0...4 ~= y:
> print("The point is in the subregion")
> default:
> break
> }
>
> However the current syntax is not ideal (in my opinion). We're not really
> declaring the operation that we want to do, and that has an impact in the
> expressivity and readability of the code. Currently we're doing matches like
> "if blue is the ocean" instead of "if the ocean is blue" or "if the ocean
> contains the whale" instead of "if the whale is in the ocean".
>
> For that reason, I would like to suggest inverting the order of the operator
> to match more closely our logical thought.
>
> case (let x, let y) where x =~ 0...4 && y =~ 0...4: // Proposed
> // vs
> case (let x, let y) where 0...4 ~= x && 0...4 ~= y: // Current
>
> I have an ongoing proposal to suggest this change and it contains a little
> more context. It is available here:
>
> https://github.com/dmcrodrigues/swift-evolution/blob/proposal/invert-order-of-pattern-match-operator/proposals/NNNN-invert-order-of-pattern-match-operator.md
> .
>
> Any feedback is very welcome.
>
> Thank you.
>
> David Rodrigues
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
--
Dave
More information about the swift-evolution
mailing list