mirror of
https://github.com/Nexoniarz/Finch.git
synced 2026-11-03 00:44:27 +00:00
Finch 2.4.0: methods, maps, errors as values; str() of any value; macOS and ARM64 docs; Kate support
- fn Struct.method(...) with self by reference, also on C structs
- map[K]V: insertion-ordered hash maps, literals, m[k] += 1, has/get/remove/keys/values
- -> T! / -> !, return error(...), or <value>, or { err }, try; fallible int/float/read_file/write_file/delete_file
- for i, x in list / for k, v in map
- print and str() share one text formatter
- LSP: method and map completion, method signatures; grammar and snippets for VS Code and Kate
- tests: 74 (methods, errors, maps + 11 failure cases); docs at all three levels, en and pl
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
fd86eb885c
commit
b872be3176
55 changed files with 3400 additions and 336 deletions
9
tests/fail/error_not_fallible.fch
Normal file
9
tests/fail/error_not_fallible.fch
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
// expect: 'check' can't fail, so it can't return an error (make it fallible: -> !)
|
||||
fn check(int n) {
|
||||
if n < 0 {
|
||||
return error("negative")
|
||||
}
|
||||
}
|
||||
fn main() {
|
||||
check(1)
|
||||
}
|
||||
4
tests/fail/error_outside_return.fch
Normal file
4
tests/fail/error_outside_return.fch
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
// expect: error(...) makes an error to return from a function that can fail
|
||||
fn main() {
|
||||
e := error("oops")
|
||||
}
|
||||
4
tests/fail/map_empty_literal.fch
Normal file
4
tests/fail/map_empty_literal.fch
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
// expect: an empty [:] needs a type, like: map[str]int m = [:]
|
||||
fn main() {
|
||||
m := [:]
|
||||
}
|
||||
5
tests/fail/map_float_key.fch
Normal file
5
tests/fail/map_float_key.fch
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
// expect: a map key must be a whole number, a char, a bool or a str, not float
|
||||
fn main() {
|
||||
map[float]int m
|
||||
print(m)
|
||||
}
|
||||
5
tests/fail/map_missing_key.fch
Normal file
5
tests/fail/map_missing_key.fch
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
// expect: the key "zoe" is not in the map
|
||||
fn main() {
|
||||
ages := ["anna": 31]
|
||||
print(ages["zoe"])
|
||||
}
|
||||
9
tests/fail/method_field_clash.fch
Normal file
9
tests/fail/method_field_clash.fch
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
// expect: the struct Point already has a field named 'x'
|
||||
struct Point {
|
||||
int x
|
||||
}
|
||||
fn Point.x() -> int {
|
||||
return 1
|
||||
}
|
||||
fn main() {
|
||||
}
|
||||
12
tests/fail/method_loop_readonly.fch
Normal file
12
tests/fail/method_loop_readonly.fch
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
// expect: the loop variable 'c' can't be changed
|
||||
struct Counter {
|
||||
int n
|
||||
}
|
||||
fn Counter.bump() {
|
||||
self.n += 1
|
||||
}
|
||||
fn main() {
|
||||
for c in [Counter(1), Counter(2)] {
|
||||
c.bump()
|
||||
}
|
||||
}
|
||||
8
tests/fail/method_missing.fch
Normal file
8
tests/fail/method_missing.fch
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
// expect: the struct Point has no methods; add one with fn Point.norm(...) { ... }
|
||||
struct Point {
|
||||
int x
|
||||
}
|
||||
fn main() {
|
||||
p := Point(1)
|
||||
print(p.norm())
|
||||
}
|
||||
5
tests/fail/or_block_value.fch
Normal file
5
tests/fail/or_block_value.fch
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
// expect: this block must leave with return, break, continue or exit
|
||||
fn main() {
|
||||
n := int("x") or { print("not a number") }
|
||||
print(n)
|
||||
}
|
||||
4
tests/fail/or_cannot_fail.fch
Normal file
4
tests/fail/or_cannot_fail.fch
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
// expect: this call can't fail, so it needs no 'or' or 'try'
|
||||
fn main() {
|
||||
print(int(3.5) or 0)
|
||||
}
|
||||
10
tests/fail/try_outside_fallible.fch
Normal file
10
tests/fail/try_outside_fallible.fch
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
// expect: try passes the error on, so 'twice' must be able to fail too (-> int!)
|
||||
fn parse(str s) -> int! {
|
||||
return int(s) or { return error("bad") }
|
||||
}
|
||||
fn twice(str s) -> int {
|
||||
return try parse(s) * 2
|
||||
}
|
||||
fn main() {
|
||||
print(twice("2"))
|
||||
}
|
||||
7
tests/fail/unhandled_error.fch
Normal file
7
tests/fail/unhandled_error.fch
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
// expect: 'parse' can fail, so say what happens then
|
||||
fn parse(str s) -> int! {
|
||||
return int(s) or { return error("bad") }
|
||||
}
|
||||
fn main() {
|
||||
print(parse("1"))
|
||||
}
|
||||
Loading…
Reference in a new issue