Something went wrong. Try again.
An experiment in static, refcounted, procedural language with ownership
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163mod innerfn extern "c" printf(fmt: ptr[u8], ..) i32fn main() unit = { match-vars() match-unit() match-bool(true) match-bool(false) match-int(42) match-int(-3) match-int(69) match-uint(42) match-uint(3) match-uint(69) match-str("foo") match-str("bar") match-str("hadas") match-types() match-guard() print-fac(10) print-fib(20)}fn match-vars() unit = { match true { mut x -> { x = false unsafe printf("x = %d\n".ptr, x) {} } _ -> { // ignored... } }}fn match-unit() int = { match {} { {} -> unsafe printf("matched unit!\n".ptr) _ -> 1 // This branch is unreachable }}fn match-bool(value: bool) unit = { unsafe printf("value = %s\n".ptr, match value { true -> "true" false -> "false" x -> "unreachable..." })}fn match-int(value: int) unit = { match value { 42 -> unsafe printf("i'm the answer\n".ptr) -3 -> unsafe printf("i'm -3\n".ptr) x -> unsafe printf("value is %d\n".ptr, x) }}fn match-uint(value: uint) unit = { match value { 42 -> unsafe printf("i'm still the answer\n".ptr) 3 -> unsafe printf("i'm still 3\n".ptr) x -> unsafe printf("and value is %d\n".ptr, x) }}fn match-str(value: &str) unit = { match value { "foo" -> unsafe printf("i'm 'foo'\n".ptr) "bar" -> unsafe printf("i'm 'bar'\n".ptr) "foo" | "bar" -> unsafe printf("i'm 'foo' or 'bar\n".ptr) x -> unsafe printf("str is '%s'\n".ptr, x.ptr) }}type Box(value: int)type Bag(a: Box, b: Box)fn match-types() unit = { let box = Box(1) match box { Box(1) -> { unsafe printf("it's 1!\n".ptr) } Box(v) -> print(v) Box(_) -> {} // unreachable _ -> {} // unreachable } let bag = Bag(Box(1), Box(3)) match bag { Bag(Box(1), _) -> { unsafe printf("a: 1, b: _\n".ptr) } Bag(b: Box(3), a: Box(a)) -> { unsafe printf("a: %d, b: 3 (named)\n".ptr, a) } Bag(Box(a), Box(3)) -> { unsafe printf("a: %d, b: 3\n".ptr, a) } Bag(a, ..) -> drop(a) _ -> {} // unreachable } // print(bag) // match inner.get(1) { // //inner.Inner(field: 1) -> {} // Error: match private field // inner.Inner(..) -> {} // Ok, field isn't used // }}fn print(box: &Box) unit = { unsafe printf("Box(%d)\n".ptr, box.value)}fn print(bag: &Bag) unit = { match bag { Bag(a, b) -> { unsafe printf("Bag(a: Box(%d), b: Box(%d))\n".ptr, a.value, b.value) {} } }}fn print(value: int) unit = { unsafe printf("%d\n".ptr, value)}fn drop(box: Box) unit = {}fn match-guard() unit = { let foo = true match foo { _ if foo -> { unsafe printf("foo=true (guard)\n".ptr) } true -> { unsafe printf("foo=true\n".ptr) } false -> { unsafe printf("foo=false\n".ptr) } foo -> { unsafe printf("foo=%d\n".ptr, foo) } }}fn print-fac(n: int) unit = { unsafe printf("fac(%d) unit = %d\n".ptr, n, fac(n))}fn fac(n: int) int = match n { 0 | 1 -> 1 n -> n * fac(n - 1) }fn print-fib(n: int) unit = { unsafe printf("fib(%d) unit = %d\n".ptr, n, fib(n))}fn fib(n: int) int = match n { 0 | 1 -> n n -> fib(n - 1) + fib(n - 2) }