mirror of
https://github.com/Nexoniarz/Finch.git
synced 2026-11-03 08:54:25 +00:00
- struct with default values; constructors Point(1, 2) / Point(x: 1); field access, auto-deref through pointers - []T arrays with bounds checks, literals, for-each, push/pop/insert/remove/clear/resize/find/contains/join/slice/reverse/sort - str carries its length: .len, s[i], +, comparison, sub/find/split/trim/upper/lower/replace/repeat/bytes, str(x), int(s), float(s) - Memory: values own their memory and are freed at the end of their block; assignment copies, temporaries move; parameters are lent and only copied when the function changes them; defer; new()/free() for manual heap memory - input(), read_file/write_file/file_exists, exit(), fn main([]str args) - Finch modules: import name, module.fn(), module.Struct - C structs from headers (fields, fixed arrays, nested); passed and returned by value with the System V x86-64 ABI; addr(fn) gives C a callback - link "file.c" compiles and links your own C code - -g emits DWARF debug info (gdb/lldb) - Small C runtime (runtime/finch_rt.c) embedded in the compiler, cached in ~/.cache/finch - Tests: 58, all clean under valgrind (MEMCHECK=1 tests/run.sh) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
78 lines
1.5 KiB
Text
78 lines
1.5 KiB
Text
struct Point {
|
|
int x
|
|
int y
|
|
}
|
|
|
|
struct Player {
|
|
str name = "nobody"
|
|
Point pos
|
|
[]int scores
|
|
int lives = 3
|
|
}
|
|
|
|
fn moved(Point p, int dx) -> Point {
|
|
return Point(x: p.x + dx, y: p.y)
|
|
}
|
|
|
|
fn total([]int xs) -> int {
|
|
sum := 0
|
|
for x in xs {
|
|
sum += x
|
|
}
|
|
return sum
|
|
}
|
|
|
|
fn addScore(Player p, int s) -> Player {
|
|
p.scores.push(s)
|
|
return p
|
|
}
|
|
|
|
fn main() {
|
|
p := Point(1, 2)
|
|
print(p, p.x, p.y)
|
|
q := moved(p, 10)
|
|
print(q)
|
|
|
|
pl := Player(name: "Ola")
|
|
print(pl)
|
|
pl.scores.push(10)
|
|
pl.scores.push(20)
|
|
pl.pos.x = 5
|
|
print(pl.name, pl.lives, pl.scores, pl.pos)
|
|
|
|
copy := pl
|
|
copy.name = "Tom"
|
|
copy.scores.push(30)
|
|
print(pl.name, pl.scores.len, copy.name, copy.scores.len)
|
|
|
|
pl2 := addScore(pl, 99)
|
|
print(pl.scores, pl2.scores)
|
|
|
|
nums := [5, 3, 8, 1]
|
|
nums.sort()
|
|
print(nums, total(nums), nums.len)
|
|
print(nums.pop(), nums)
|
|
nums.insert(0, 42)
|
|
nums.remove(1)
|
|
print(nums, nums.contains(8), nums.find(3))
|
|
|
|
names := ["b", "a", "c"]
|
|
names.sort()
|
|
print(names, names.join("-"))
|
|
|
|
s := "Hello"
|
|
s += ", Finch"
|
|
print(s, s.len, s[0], s.upper(), s.sub(0, 5))
|
|
words := "a,b,,c".split(",")
|
|
print(words, words.len)
|
|
print(" trim ".trim(), "x".repeat(3), "abc".replace("b", "BB"), "hello".contains("ell"))
|
|
print(str(42) + "!", str(3.5), str(true), int("123") + 1, float("2.5") * 2)
|
|
s[0] = 'J'
|
|
print(s)
|
|
for c in "hi" {
|
|
print(c)
|
|
}
|
|
grid := [[1, 2], [3, 4]]
|
|
grid[1].push(5)
|
|
print(grid, grid[1][2])
|
|
}
|