@@ -3,7 +3,8 @@ layout: doc-page
3
3
title : Rules for Operators
4
4
---
5
5
6
- There are two annotations that regulate operators: ` infix ` and ` alpha ` .
6
+ The rules for infix operators have changed. There are two annotations that regulate operators: ` infix ` and ` alpha ` .
7
+ Furthermore, a syntax change allows infix operators to be written on the left in a multi-line expression.
7
8
8
9
## The @alpha Annotation
9
10
@@ -127,3 +128,53 @@ The purpose of the `@infix` annotation is to achieve consistency across a code b
127
128
128
129
5 . To smooth migration to Scala 3.0 , alphanumeric operations will only be deprecated from Scala 3.1 onwards,
129
130
or if the `-strict` option is given in Dotty / Scala 3 .
131
+
132
+ ## Syntax Change
133
+
134
+ Infix operators can now appear at the start of lines in a multi- line expression. Examples :
135
+ ```scala
136
+ val str = " hello"
137
+ ++ " world"
138
+ ++ " !"
139
+
140
+ def condition =
141
+ x > 0
142
+ || xs.exists(_ > 0 )
143
+ || xs.isEmpty
144
+ ```
145
+ Previously, these expressions would have been rejected, since the compiler's semicolon inference
146
+ would have treated the continuations ` ++ " world" ` or ` || xs.isEmpty ` as separate statements.
147
+
148
+ To make this syntax work, the rules are modified to not infer semicolons in front of leading infix operators.
149
+ A _ leading infix operator_ is
150
+ - a symbolic identifier such as ` + ` , or ` approx_== ` , or an identifier in backticks,
151
+ - that starts a new line,
152
+ - that precedes a token on the same line that can start an expression,
153
+ - and that is immediately followed by at least one space character ` ' ' ` .
154
+
155
+ Example:
156
+
157
+ ``` scala
158
+ freezing
159
+ | boiling
160
+ ```
161
+ This is recognized as a single infix operation. Compare with:
162
+ ``` scala
163
+ freezing
164
+ ! boiling
165
+ ```
166
+ This is seen as two statements, ` freezing ` and ` !boiling ` . The difference is that only the operator in the first example
167
+ is followed by a space.
168
+
169
+ Another example:
170
+ ``` scala
171
+ println(" hello" )
172
+ ???
173
+ ??? match { case 0 => 1 }
174
+ ```
175
+ This code is recognized as three different statements. ` ??? ` is syntactically a symbolic identifier, but
176
+ neither of its occurrences is followed by a space and a token that can start an expression.
177
+
178
+
179
+
180
+
0 commit comments