mirror of
https://github.com/Nexoniarz/Finch.git
synced 2026-11-03 08:54:25 +00:00
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>
This commit is contained in:
parent
0591cd20f3
commit
1dc976bd8f
59 changed files with 4577 additions and 1047 deletions
98
tests/run/memory.fn
Normal file
98
tests/run/memory.fn
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
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)
|
||||
}
|
||||
Loading…
Reference in a new issue