Finch/tests/run/memory.fn
Nexoniarz 1dc976bd8f Structs, arrays, owned strings, memory model, modules, debug info
- 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>
2026-10-08 18:57:37 +02:00

98 lines
1.7 KiB
Text

struct Node {
str name
ptr[Node] next
[]str tags
}
fn build(int n) -> []str {
[]str out
out.resize(n)
return out
}
fn firstLong([]str words) -> str {
for w in words {
tmp := w + "!"
if w.len > 3 {
return tmp
}
}
return "none"
}
fn loops() -> int {
count := 0
for i in 0..10 {
s := "item " + str(i)
if i == 2 {
continue
}
if i == 6 {
break
}
count += s.len
}
while true {
t := "x" + "y"
if t.len == 2 {
break
}
}
return count
}
fn deferred() -> str {
log := "start"
defer print("deferred ran, log was:", log)
log = log + " middle"
names := ["a", "b"]
defer print("names:", names)
return log + " end"
}
fn main([]str args) {
print(args.len > 0)
print(firstLong(["hi", "hello", "hey"]))
print(firstLong(["a"]))
print(loops())
print(deferred())
s := "ab"
s = s + s
s = s
print(s)
list := ["one", "two", "three"]
for w in list {
if w == "two" {
list.push("four")
}
}
print(list)
last := list.pop()
print(last, list)
head := new(Node(name: "first", tags: ["t1"]))
head.next = new(Node(name: "second"))
print(head.name, head.next.name, head.tags)
n := head
while n != null {
print("node", n.name)
n = n.next
}
free(head.next)
free(head)
[]str words
for i in 0..3 {
words.push("w" + str(i))
}
words.clear()
words.resize(2)
print(words, words.len)
print([1, 2, 3].slice(1, 3), "abc".bytes())
x := ["keep"]
y := x
x[0] = "changed"
print(x, y)
}