double dot in for ranges

This commit is contained in:
2025-06-13 16:59:22 +02:00
parent a93274d8ac
commit 7425ab256b
19 changed files with 43 additions and 33 deletions

View File

@@ -15,6 +15,6 @@ func fib[n: I64] : I64
return fib(n-2) + fib(n-1) return fib(n-2) + fib(n-1)
func main[] : I64 func main[] : I64
for i in 0:20 for i in 0..20
fib(i) |> I64.to_string() |> print() fib(i) |> I64.to_string() |> print()
``` ```

View File

@@ -4,7 +4,7 @@ func main[] : I64
Array.push(xs, 6533) Array.push(xs, 6533)
Array.push(xs, 4574) Array.push(xs, 4574)
for i in 0:Array.size(xs) for i in 0..Array.size(xs)
xs xs
|> Array.nth(i) |> Array.nth(i)
|> print_i64() |> print_i64()

View File

@@ -1,7 +1,7 @@
func main[] : I64 func main[] : I64
let sum: I64 = 0 let sum: I64 = 0
for i in 0:1000 for i in 0..1000
if i % 5 == 0 || i % 3 == 0 if i % 5 == 0 || i % 3 == 0
sum = sum + i sum = sum + i
print_i64(sum) print_i64(sum)

View File

@@ -1,7 +1,7 @@
func main[] : I64 func main[] : I64
let sum: I64 = 0 let sum: I64 = 0
for i in 0:2000000 for i in 0..2000000
if Math.is_prime(i) if Math.is_prime(i)
sum = sum + i sum = sum + i
print_i64(sum) print_i64(sum)

View File

@@ -2,7 +2,7 @@ func num_divisors[n: I64] : I64
let end: I64 = Math.isqrt(n) let end: I64 = Math.isqrt(n)
let result: I64 = 0 let result: I64 = 0
for i in 1:end+1 for i in 1..end+1
if n % i == 0 if n % i == 0
result = result + 2 result = result + 2

View File

@@ -14,7 +14,7 @@ func main[] : I64
let max: I64 = 0 let max: I64 = 0
let max_index: I64 = 0 let max_index: I64 = 0
for i in 1:1000000 for i in 1..1000000
let seq: I64 = collatz_seq(i) let seq: I64 = collatz_seq(i)
if seq > max if seq > max
max = seq max = seq

View File

@@ -3,7 +3,7 @@ func main[] : I64
let r: I64 = 20 let r: I64 = 20
let out: I64 = 1 let out: I64 = 1
for i in 1:r+1 for i in 1..r+1
out = out * (n - (r - i)) / i out = out * (n - (r - i)) / i
print_i64(out) print_i64(out)

View File

@@ -1,8 +1,8 @@
func main[] : I64 func main[] : I64
let out: I64 = 0 let out: I64 = 0
for a in 500:1000 for a in 500..1000
for b in 500:1000 for b in 500..1000
if a * b > out if a * b > out
let s: String = I64.to_string(a * b) let s: String = I64.to_string(a * b)
let s_rev: String = String.rev(s) let s_rev: String = String.rev(s)

View File

@@ -1,6 +1,6 @@
func main[] : I64 func main[] : I64
let out: I64 = 1 let out: I64 = 1
for i in 1:21 for i in 1..21
out = Math.lcm(out, i) out = Math.lcm(out, i)
print_i64(out) print_i64(out)

View File

@@ -1,10 +1,10 @@
func main[] : I64 func main[] : I64
let sum_of_squares: I64 = 0 let sum_of_squares: I64 = 0
for i in 1:101 for i in 1..101
sum_of_squares = sum_of_squares + i * i sum_of_squares = sum_of_squares + i * i
let square_of_sum: I64 = 0 let square_of_sum: I64 = 0
for i in 1:101 for i in 1..101
square_of_sum = square_of_sum + i square_of_sum = square_of_sum + i
square_of_sum = square_of_sum * square_of_sum square_of_sum = square_of_sum * square_of_sum

View File

@@ -3,7 +3,7 @@ func main[] : I64
let out: I64 = 0 let out: I64 = 0
let max: I64 = strlen(n) - 13 let max: I64 = strlen(n) - 13
for i in 0:max for i in 0..max
let s: I64 = 1 let s: I64 = 1
let j: I64 = 0 let j: I64 = 0
while j < 13 while j < 13

View File

@@ -1,6 +1,6 @@
func main[] : I64 func main[] : I64
for a in 1:1000 for a in 1..1000
for b in 1:1000 for b in 1..1000
let c: I64 = 1000 - b - a let c: I64 = 1000 - b - a
if a * a + b * b == c * c if a * a + b * b == c * c
print_i64(a * b * c) print_i64(a * b * c)

View File

@@ -12,7 +12,7 @@ func do_quicksort[arr: Array, low: I64, high: I64] : I64
func partition[arr: Array, low: I64, high: I64] : I64 func partition[arr: Array, low: I64, high: I64] : I64
let pivot: I64 = Array.nth(arr, high) let pivot: I64 = Array.nth(arr, high)
let i: I64 = low - 1 let i: I64 = low - 1
for j in low:high for j in (low)..high
if Array.nth(arr, j) <= pivot if Array.nth(arr, j) <= pivot
i = i + 1 i = i + 1
let temp: I64 = Array.nth(arr, i) let temp: I64 = Array.nth(arr, i)
@@ -26,11 +26,11 @@ func partition[arr: Array, low: I64, high: I64] : I64
func main[] : I64 func main[] : I64
let arr: Array = [340, 252, 352, 117, 650, 652, 322, 175, 714, 268, 725, 664] let arr: Array = [340, 252, 352, 117, 650, 652, 322, 175, 714, 268, 725, 664]
for i in 0:Array.size(arr) for i in 0..Array.size(arr)
print_i64(Array.nth(arr, i)) print_i64(Array.nth(arr, i))
print("------------") print("------------")
quicksort(arr) quicksort(arr)
for i in 0:Array.size(arr) for i in 0..Array.size(arr)
print_i64(Array.nth(arr, i)) print_i64(Array.nth(arr, i))

View File

@@ -1,7 +1,7 @@
func rule110_step[state: Array] : Array func rule110_step[state: Array] : Array
let new_state: Array = [] let new_state: Array = []
for i in 0:Array.size(state) for i in 0..Array.size(state)
let left: Bool = false let left: Bool = false
if i - 1 >= 0 if i - 1 >= 0
left = Array.nth(state, i-1) left = Array.nth(state, i-1)
@@ -16,7 +16,7 @@ func rule110_step[state: Array] : Array
func to_str[state: Array]: String func to_str[state: Array]: String
let out: String = malloc(Array.size(state)) let out: String = malloc(Array.size(state))
for i in 0:Array.size(state) for i in 0..Array.size(state)
if Array.nth(state, i) if Array.nth(state, i)
String.set(out, i, String.nth("#", 0)) String.set(out, i, String.nth("#", 0))
else else
@@ -27,11 +27,11 @@ func main[] : I64
let SIZE: I64 = 60 let SIZE: I64 = 60
let state: Array = [] let state: Array = []
for i in 0:SIZE for i in 0..SIZE
Array.push(state, false) Array.push(state, false)
Array.push(state, true) Array.push(state, true)
print(to_str(state)) print(to_str(state))
for i in 0:SIZE for i in 0..SIZE
state = rule110_step(state) state = rule110_step(state)
print(to_str(state)) print(to_str(state))

View File

@@ -112,7 +112,6 @@ extern strcat
extern strcpy extern strcpy
extern strdup extern strdup
extern strlcpy extern strlcpy
extern puts
extern fopen extern fopen
extern fseek extern fseek
extern ftell extern ftell

View File

@@ -219,7 +219,7 @@ impl Parser {
let var = self.consume(TokenType::Identifier, "expected variable name after 'for'")?; let var = self.consume(TokenType::Identifier, "expected variable name after 'for'")?;
self.consume(TokenType::KeywordIn, "expected 'in' after variable name")?; self.consume(TokenType::KeywordIn, "expected 'in' after variable name")?;
let start = self.expression()?; let start = self.expression()?;
self.consume(TokenType::Colon, "expected ':' after the number")?; self.consume(TokenType::DoubleDot, "expected '..' after the number")?;
let end = self.expression()?; let end = self.expression()?;
let body = self.block()?; let body = self.block()?;

View File

@@ -21,7 +21,7 @@ func String.concat[a: String, b: String] : String
return c return c
func String.find[s: String, needle: U8] : I64 func String.find[s: String, needle: U8] : I64
for i in 0:strlen(s) for i in 0..strlen(s)
if String.nth(s, i) == needle if String.nth(s, i) == needle
return i return i
return -1 return -1
@@ -47,7 +47,7 @@ func String.rev[s: String] : String
let len: I64 = strlen(s) let len: I64 = strlen(s)
let out: String = malloc(len + 1) let out: String = malloc(len + 1)
for i in 0:len for i in 0..len
String.set(out, i, String.nth(s, len - i - 1)) String.set(out, i, String.nth(s, len - i - 1))
String.set(out, len, 0) String.set(out, len, 0)
return out return out
@@ -81,7 +81,7 @@ func U8.parse_i64[c: U8]: I64
return c - 48 return c - 48
func I64.to_string[n: I64] : String func I64.to_string[n: I64] : String
let x: I64 = malloc(21) let x: String = malloc(21)
sprintf(x, "%ld", n) sprintf(x, "%ld", n)
return x return x
@@ -112,7 +112,7 @@ func Math.abs[n: I64] : I64
func Math.pow[b: I64, e: I64] : I64 func Math.pow[b: I64, e: I64] : I64
let out: I64 = 1 let out: I64 = 1
for i in 0:e for i in 0..e
out = out * b out = out * b
return out return out
@@ -154,12 +154,12 @@ func Array.new[] : Array
func Math.Crypto.rc4[key: String, plaintext: String]: String func Math.Crypto.rc4[key: String, plaintext: String]: String
let S: String = malloc(256) let S: String = malloc(256)
for i in 0:256 for i in 0..256
String.set(S, i, i) String.set(S, i, i)
let j: I64 = 0 let j: I64 = 0
let key_len: I64 = strlen(key) let key_len: I64 = strlen(key)
for i in 0:256 for i in 0..256
j = (j + String.nth(S, i) + String.nth(key, i % key_len)) % 256 j = (j + String.nth(S, i) + String.nth(key, i % key_len)) % 256
let tmp: U8 = String.nth(S, i) let tmp: U8 = String.nth(S, i)
String.set(S, i, String.nth(S, j)) String.set(S, i, String.nth(S, j))
@@ -169,7 +169,7 @@ func Math.Crypto.rc4[key: String, plaintext: String]: String
j = 0 j = 0
let plaintext_len: I64 = strlen(plaintext) let plaintext_len: I64 = strlen(plaintext)
let ciphertext: String = malloc(plaintext_len+1) let ciphertext: String = malloc(plaintext_len+1)
for n in 0:plaintext_len for n in 0..plaintext_len
i = (i + 1) % 256 i = (i + 1) % 256
j = (j + String.nth(S, i)) % 256 j = (j + String.nth(S, i)) % 256

View File

@@ -18,6 +18,7 @@ pub enum TokenType {
And, And,
Or, Or,
Pipe, Pipe,
DoubleDot,
Equal, Equal,
DoubleEqual, DoubleEqual,
@@ -147,6 +148,13 @@ impl Tokenizer {
'%' => self.add_token(TokenType::Mod), '%' => self.add_token(TokenType::Mod),
'^' => self.add_token(TokenType::Xor), '^' => self.add_token(TokenType::Xor),
':' => self.add_token(TokenType::Colon), ':' => self.add_token(TokenType::Colon),
'.' => {
if self.match_char('.') {
self.add_token(TokenType::DoubleDot)
} else {
return error!(self.loc, "expected '.' after '.'");
}
}
'/' => { '/' => {
if self.match_char('/') { if self.match_char('/') {
while !self.eof() && self.peek() != '\n' { while !self.eof() && self.peek() != '\n' {
@@ -287,7 +295,10 @@ impl Tokenizer {
self.advance(); self.advance();
} }
if self.peek() == '.' { if self.peek() == '.'
&& (self.current + 1 >= self.source.len())
&& self.source[self.current + 1].is_ascii_digit()
{
self.advance(); self.advance();
while self.peek().is_ascii_digit() { while self.peek().is_ascii_digit() {
self.advance(); self.advance();

View File

@@ -22,5 +22,5 @@ func main[] : I64
system("cargo build --release") system("cargo build --release")
let files: Array = OS.listdir("examples/") let files: Array = OS.listdir("examples/")
for i in 0:Array.size(files) for i in 0..Array.size(files)
run_test(Array.nth(files, i)) run_test(Array.nth(files, i))