Skip to content

Commit

Permalink
vine: boolean expressions (#41)
Browse files Browse the repository at this point in the history
  • Loading branch information
tjjfvi authored Oct 18, 2024
1 parent 4b3fc76 commit 95c3d8f
Show file tree
Hide file tree
Showing 33 changed files with 588 additions and 344 deletions.
8 changes: 8 additions & 0 deletions tests/programs/fail/is_not.vi
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@

fn main(x) {
if x is y {} else { y }
if !(x is y) { y }
if x is y || y is z { (y, z) }
while x is y {}
y
}
30 changes: 30 additions & 0 deletions tests/programs/logic.vi
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@

use std::{io::println, bool::{true, false}};

fn main(&io) {
io.print_bool(true);
io.print_bool(true && true);
io.print_bool(true || true);
io.print_bool(true || false);
io.print_bool(false || true);
io.print_bool(!false);
io.print_bool(!!true);
io.println("---");
io.print_bool(false);
io.print_bool(false || false);
io.print_bool(true && false);
io.print_bool(false && true);
io.print_bool(false && false);
io.print_bool(!true);
io.print_bool(!!false);

// Test short-circuiting behavior; `()` is an eraser node,
// so would erase `io` if it was evaluated.
io.println("---");
io.print_bool(true || ());
io.print_bool(false && ());
}

fn print_bool(&io, bool) {
io.println(if bool { "true" } else { "false" })
}
25 changes: 14 additions & 11 deletions tests/programs/option_party.vi
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,6 @@ use std::{
and_then,
or,
unwrap_or,
is_some,
is_none,
is_some_and,
is_none_or,
unwrap,
}
};
Expand Down Expand Up @@ -58,17 +54,17 @@ fn main(io) {
io.print_u32(Some(1).unwrap_or(0));

io.println("is_some:");
io.print_bool(None.is_some());
io.print_bool(Some(()).is_some());
io.print_bool(None is Some(_));
io.print_bool(Some(()) is Some(_));

io.println("is_none:");
io.print_bool(None.is_none());
io.print_bool(Some(()).is_none());
io.print_bool(None is None);
io.print_bool(Some(()) is None);

io.println("is_some_and:");
io.print_bool(None.is_some_and(fn(x) x > 0));
io.print_bool(Some(0).is_some_and(fn(x) x > 0));
io.print_bool(Some(1).is_some_and(fn(x) x > 0));
io.print_bool(None is Some(x) && x > 0);
io.print_bool(Some(0) is Some(x) && x > 0);
io.print_bool(Some(1) is Some(x) && x > 0);

io.println("is_none_or:");
io.print_bool(None.is_none_or(fn(x) x > 0));
Expand Down Expand Up @@ -106,3 +102,10 @@ fn increment_option(&option) {
fn add_options(a, b) {
a.and_then(fn(a) b.map(fn(b) a + b))
}

fn is_none_or(&move self, f) {
match self {
Some(val) => f(val),
None => true,
}
}
6 changes: 3 additions & 3 deletions tests/snaps/vine/basic_diverge/compiled.iv
Original file line number Diff line number Diff line change
Expand Up @@ -45,17 +45,17 @@

::std::str::concat { fn(tup(@add(n0 n1) fn(n3 n4)) fn(tup(n0 fn(n2 n3)) tup(n1 fn(n2 n4)))) }

::std::u32::to_string { fn(dup152(?(::std::u32::to_string::5 ::std::u32::to_string::1 x(n1 n0)) n1) n0) }
::std::u32::to_string { fn(dup122(?(::std::u32::to_string::5 ::std::u32::to_string::1 x(n1 n0)) n1) n0) }

::std::u32::to_string::1 {
x(n1 n2)
::std::u32::to_string::2 = x(n1 x(tup(0 fn(n0 n0)) n2))
}

::std::u32::to_string::2 { x(dup152(?(::std::u32::to_string::4 ::std::u32::to_string::3 x(n2 n0)) n2) n0) }
::std::u32::to_string::2 { x(dup122(?(::std::u32::to_string::4 ::std::u32::to_string::3 x(n2 n0)) n2) n0) }

::std::u32::to_string::3 {
x(dup152(@rem(10 n1) @div(10 n5)) x(tup(@add(1 n0) fn(n3 n4)) n6))
x(dup122(@rem(10 n1) @div(10 n5)) x(tup(@add(1 n0) fn(n3 n4)) n6))
48 = @add(n1 n2)
::std::u32::to_string::2 = x(n5 x(tup(n0 fn(n3 tup(n2 n4))) n6))
}
Expand Down
6 changes: 6 additions & 0 deletions tests/snaps/vine/fail/is_not.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
error tests/programs/fail/is_not.vi:3:23 - cannot find `y` in `::is_not::main`
error tests/programs/fail/is_not.vi:4:18 - cannot find `y` in `::is_not::main`
error tests/programs/fail/is_not.vi:5:16 - cannot find `y` in `::is_not::main`
error tests/programs/fail/is_not.vi:5:26 - cannot find `y` in `::is_not::main`
error tests/programs/fail/is_not.vi:5:29 - cannot find `z` in `::is_not::main`
error tests/programs/fail/is_not.vi:7:3 - cannot find `y` in `::is_not::main`
6 changes: 3 additions & 3 deletions tests/snaps/vine/fib/compiled.iv
Original file line number Diff line number Diff line change
Expand Up @@ -45,17 +45,17 @@

::std::str::concat { fn(tup(@add(n0 n1) fn(n3 n4)) fn(tup(n0 fn(n2 n3)) tup(n1 fn(n2 n4)))) }

::std::u32::to_string { fn(dup150(?(::std::u32::to_string::5 ::std::u32::to_string::1 x(n1 n0)) n1) n0) }
::std::u32::to_string { fn(dup120(?(::std::u32::to_string::5 ::std::u32::to_string::1 x(n1 n0)) n1) n0) }

::std::u32::to_string::1 {
x(n1 n2)
::std::u32::to_string::2 = x(n1 x(tup(0 fn(n0 n0)) n2))
}

::std::u32::to_string::2 { x(dup150(?(::std::u32::to_string::4 ::std::u32::to_string::3 x(n2 n0)) n2) n0) }
::std::u32::to_string::2 { x(dup120(?(::std::u32::to_string::4 ::std::u32::to_string::3 x(n2 n0)) n2) n0) }

::std::u32::to_string::3 {
x(dup150(@rem(10 n1) @div(10 n5)) x(tup(@add(1 n0) fn(n3 n4)) n6))
x(dup120(@rem(10 n1) @div(10 n5)) x(tup(@add(1 n0) fn(n3 n4)) n6))
48 = @add(n1 n2)
::std::u32::to_string::2 = x(n5 x(tup(n0 fn(n3 tup(n2 n4))) n6))
}
Expand Down
38 changes: 19 additions & 19 deletions tests/snaps/vine/fib_repl/compiled.iv
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@
::fib_repl::fib::1 = x(n0 x(0 x(n1 1)))
}

::fib_repl::fib::1 { x(dup13(?(::fib_repl::fib::3 ::fib_repl::fib::2 x(n3 n0)) n3) n0) }
::fib_repl::fib::1 { x(dup12(?(::fib_repl::fib::3 ::fib_repl::fib::2 x(n3 n0)) n3) n0) }

::fib_repl::fib::2 {
x(@sub(1 n3) x(@add(n2 n0) x(n5 dup15(n1 n2))))
x(@sub(1 n3) x(@add(n2 n0) x(n5 dup14(n1 n2))))
tup(n1 n0) = tup(n4 n6)
::fib_repl::fib::1 = x(n3 x(n4 x(n5 n6)))
}
Expand All @@ -48,7 +48,7 @@
::std::io::print::1 = x(n0 x(n1 x(n2 n3)))
}

::std::io::print::1 { x(n0 x(n1 x(dup26(?(::std::io::print::3 ::std::io::print::2 x(n0 x(n1 x(n3 n2)))) n3) n2))) }
::std::io::print::1 { x(n0 x(n1 x(dup25(?(::std::io::print::3 ::std::io::print::2 x(n0 x(n1 x(n3 n2)))) n3) n2))) }

::std::io::print::2 {
x(n1 x(n3 x(@sub(1 n4) tup(n0 n5))))
Expand All @@ -71,11 +71,11 @@

::std::io::read_line {
fn(ref(n0 n2) n3)
::std::io::read_byte = fn(ref(n0 n1) fn(0 dup45(?(::std::io::read_line::9 ::std::io::read_line::1 x(n1 x(n2 x(n4 n3)))) n4)))
::std::io::read_byte = fn(ref(n0 n1) fn(0 dup44(?(::std::io::read_line::9 ::std::io::read_line::1 x(n1 x(n2 x(n4 n3)))) n4)))
}

::std::io::read_line::1 {
x(n1 x(n2 x(dup45(@eq(10 ?(::std::io::read_line::3 ::std::io::read_line::2 x(n1 x(n2 x(n4 n3))))) n4) n0)))
x(n1 x(n2 x(dup44(@eq(10 ?(::std::io::read_line::3 ::std::io::read_line::2 x(n1 x(n2 x(n4 n3))))) n4) n0)))
::std::option::Option::Some = fn(n3 n0)
}

Expand All @@ -89,7 +89,7 @@

::std::io::read_line::4 {
x(n0 x(n2 n3))
::std::io::read_byte = fn(ref(n0 n1) fn(10 dup45(@ne(10 ?(::std::io::read_line::6 ::std::io::read_line::5 x(n1 x(n2 x(n5 n3))))) n5)))
::std::io::read_byte = fn(ref(n0 n1) fn(10 dup44(@ne(10 ?(::std::io::read_line::6 ::std::io::read_line::5 x(n1 x(n2 x(n5 n3))))) n5)))
}

::std::io::read_line::5 {
Expand All @@ -113,17 +113,17 @@

::std::str::single { fn(n0 tup(1 fn(n1 tup(n0 n1)))) }

::std::u32::to_string { fn(dup160(?(::std::u32::to_string::5 ::std::u32::to_string::1 x(n1 n0)) n1) n0) }
::std::u32::to_string { fn(dup129(?(::std::u32::to_string::5 ::std::u32::to_string::1 x(n1 n0)) n1) n0) }

::std::u32::to_string::1 {
x(n1 n2)
::std::u32::to_string::2 = x(n1 x(tup(0 fn(n0 n0)) n2))
}

::std::u32::to_string::2 { x(dup160(?(::std::u32::to_string::4 ::std::u32::to_string::3 x(n2 n0)) n2) n0) }
::std::u32::to_string::2 { x(dup129(?(::std::u32::to_string::4 ::std::u32::to_string::3 x(n2 n0)) n2) n0) }

::std::u32::to_string::3 {
x(dup160(@rem(10 n1) @div(10 n5)) x(tup(@add(1 n0) fn(n3 n4)) n6))
x(dup129(@rem(10 n1) @div(10 n5)) x(tup(@add(1 n0) fn(n3 n4)) n6))
48 = @add(n1 n2)
::std::u32::to_string::2 = x(n5 x(tup(n0 fn(n3 tup(n2 n4))) n6))
}
Expand All @@ -132,39 +132,39 @@

::std::u32::to_string::5 { x(_ tup(1 fn(n0 tup(48 n0)))) }

::std::u32::parse { fn(tup(dup170(@eq(0 ?(::std::u32::parse::2 ::std::u32::parse::1 x(n2 x(n0 n1)))) n2) n0) n1) }
::std::u32::parse { fn(tup(dup139(@eq(0 ?(::std::u32::parse::2 ::std::u32::parse::1 x(n2 x(n0 n1)))) n2) n0) n1) }

::std::u32::parse::1 {
x(_ x(_ n0))
::std::u32::parse::12 = x(n0 ::std::option::Option::None)
::std::u32::parse::11 = x(n0 ::std::option::Option::None)
}

::std::u32::parse::2 {
x(n0 x(fn(_ n1) n2))
::std::u32::parse::3 = x(n0 x(n1 x(0 n2)))
}

::std::u32::parse::3 { x(dup170(?(::std::u32::parse::9 ::std::u32::parse::4 x(n3 n0)) n3) n0) }
::std::u32::parse::3 { x(dup139(?(::std::u32::parse::9 ::std::u32::parse::4 x(n3 n0)) n3) n0) }

::std::u32::parse::4 {
x(n2 x(tup(dup174(dup(n0 @le(57 n1)) n6) n3) x(n4 n5)))
48 = @le(n0 @u32_and(n1 @ne(1 ?(::std::u32::parse::8 ::std::u32::parse::5 x(n2 x(n3 x(n4 x(n6 n5))))))))
x(n2 x(tup(dup143(dup(n0 @le(57 n1)) n6) n3) x(n4 n5)))
48 = @le(n0 @u32_and(n1 ?(::std::u32::parse::6 ::std::u32::parse::8 x(n2 x(n3 x(n4 x(n6 n5)))))))
}

::std::u32::parse::5 { x(_ x(_ x(_ x(_ ::std::option::Option::None)))) }
::std::u32::parse::6 { x(_ x(_ x(_ x(_ ::std::option::Option::None)))) }

::std::u32::parse::8 {
x(@sub(1 n1) x(n2 x(@mul(10 @add(n0 n3)) x(@sub(48 n0) n4))))
::std::u32::parse::3 = x(n1 x(n2 x(n3 n4)))
}

::std::u32::parse::9 { x(_ x(_ ::std::u32::parse::11)) }
::std::u32::parse::9 { x(_ x(_ ::std::u32::parse::10)) }

::std::u32::parse::11 {
::std::u32::parse::10 {
x(n0 n1)
::std::option::Option::Some = fn(n0 n2)
::std::u32::parse::12 = x(n1 n2)
::std::u32::parse::11 = x(n1 n2)
}

::std::u32::parse::12 { x(n0 n0) }
::std::u32::parse::11 { x(n0 n0) }

8 changes: 4 additions & 4 deletions tests/snaps/vine/fib_repl/stats.txt
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@

Interactions
Total 14_008_829
Total 14_008_806
Annihilate 6_004_137
Commute 0
Copy 2_000_867
Erase 1_000_873
Expand 2_001_376
Call 2_001_063
Call 2_001_040
Branch 1_000_513

Memory
Heap 720 B
Allocated 272_172_832 B
Freed 272_172_832 B
Allocated 272_172_464 B
Freed 272_172_464 B
6 changes: 3 additions & 3 deletions tests/snaps/vine/fizzbuzz/compiled.iv
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,17 @@

::std::io::print_char { fn(ref(@io_print_char(char io) io) fn(char _)) }

::std::u32::to_string { fn(dup156(?(::std::u32::to_string::5 ::std::u32::to_string::1 x(n1 n0)) n1) n0) }
::std::u32::to_string { fn(dup126(?(::std::u32::to_string::5 ::std::u32::to_string::1 x(n1 n0)) n1) n0) }

::std::u32::to_string::1 {
x(n1 n2)
::std::u32::to_string::2 = x(n1 x(tup(0 fn(n0 n0)) n2))
}

::std::u32::to_string::2 { x(dup156(?(::std::u32::to_string::4 ::std::u32::to_string::3 x(n2 n0)) n2) n0) }
::std::u32::to_string::2 { x(dup126(?(::std::u32::to_string::4 ::std::u32::to_string::3 x(n2 n0)) n2) n0) }

::std::u32::to_string::3 {
x(dup156(@rem(10 n1) @div(10 n5)) x(tup(@add(1 n0) fn(n3 n4)) n6))
x(dup126(@rem(10 n1) @div(10 n5)) x(tup(@add(1 n0) fn(n3 n4)) n6))
48 = @add(n1 n2)
::std::u32::to_string::2 = x(n5 x(tup(n0 fn(n3 tup(n2 n4))) n6))
}
Expand Down
6 changes: 3 additions & 3 deletions tests/snaps/vine/inverse/compiled.iv
Original file line number Diff line number Diff line change
Expand Up @@ -93,17 +93,17 @@

::std::str::concat { fn(tup(@add(n0 n1) fn(n3 n4)) fn(tup(n0 fn(n2 n3)) tup(n1 fn(n2 n4)))) }

::std::u32::to_string { fn(dup176(?(::std::u32::to_string::5 ::std::u32::to_string::1 x(n1 n0)) n1) n0) }
::std::u32::to_string { fn(dup146(?(::std::u32::to_string::5 ::std::u32::to_string::1 x(n1 n0)) n1) n0) }

::std::u32::to_string::1 {
x(n1 n2)
::std::u32::to_string::2 = x(n1 x(tup(0 fn(n0 n0)) n2))
}

::std::u32::to_string::2 { x(dup176(?(::std::u32::to_string::4 ::std::u32::to_string::3 x(n2 n0)) n2) n0) }
::std::u32::to_string::2 { x(dup146(?(::std::u32::to_string::4 ::std::u32::to_string::3 x(n2 n0)) n2) n0) }

::std::u32::to_string::3 {
x(dup176(@rem(10 n1) @div(10 n5)) x(tup(@add(1 n0) fn(n3 n4)) n6))
x(dup146(@rem(10 n1) @div(10 n5)) x(tup(@add(1 n0) fn(n3 n4)) n6))
48 = @add(n1 n2)
::std::u32::to_string::2 = x(n5 x(tup(n0 fn(n3 tup(n2 n4))) n6))
}
Expand Down
Loading

0 comments on commit 95c3d8f

Please sign in to comment.