lang: range bound markers — '=' inclusive / '<' exclusive on either side of '..'
Each side of '..' takes an optional bound marker, defaulting to
start-inclusive, end-exclusive (a..b == a=..<b; a..=b stays the short
end-inclusive spelling):
for 0<..<N (i) { } // 1 .. N-1 (both exclusive)
for 0=..=N (i) { } // 0 .. N (both inclusive)
for 0<..=N (i) { } // 1 .. N
for 0..<N (i) { } // 0 .. N-1 (explicit default)
for xs, 2<.. (x, i) // open range, exclusive start: i = 3, 4, ...
The nine lexemes are single tokens (maximal munch on '<'/'='/'..'), so
expression parsing never sees the leading marker as a comparison; '<',
'<<', '<=', '==', '=>' lex unchanged. An explicit end marker makes the
end expression mandatory; open forms are a.. / a<.. / a=... Works in
runtime, multi-iterable, and inline-for headers.
Regression: examples/0051-basic-for-range-bounds.sx (full matrix, open
start-marked ranges, comptime unroll, runtime bounds, lexer
non-regression); 1152's pinned message generalized.
This commit is contained in:
@@ -53,6 +53,13 @@ pub const Tag = enum {
|
||||
dot, // .
|
||||
dot_dot, // ..
|
||||
dot_dot_eq, // ..=
|
||||
dot_dot_lt, // ..<
|
||||
lt_dot_dot, // <..
|
||||
lt_dot_dot_eq, // <..=
|
||||
lt_dot_dot_lt, // <..<
|
||||
eq_dot_dot, // =..
|
||||
eq_dot_dot_eq, // =..=
|
||||
eq_dot_dot_lt, // =..<
|
||||
dollar, // $
|
||||
|
||||
// Operators
|
||||
@@ -152,6 +159,13 @@ pub const Tag = enum {
|
||||
.dot => ".",
|
||||
.dot_dot => "..",
|
||||
.dot_dot_eq => "..=",
|
||||
.dot_dot_lt => "..<",
|
||||
.lt_dot_dot => "<..",
|
||||
.lt_dot_dot_eq => "<..=",
|
||||
.lt_dot_dot_lt => "<..<",
|
||||
.eq_dot_dot => "=..",
|
||||
.eq_dot_dot_eq => "=..=",
|
||||
.eq_dot_dot_lt => "=..<",
|
||||
.dollar => "$",
|
||||
.plus => "+",
|
||||
.minus => "-",
|
||||
|
||||
Reference in New Issue
Block a user