list_reverse.rr
enum List<T> {
Nil,
Cons(T, List<T>)
}
fn reverse_impl(list: List<i32>, acc: List<i32>) -> List<i32> {
match list {
List::Nil => acc,
List::Cons(x, xs) =>
reverse_impl(xs, List::Cons{x, acc})
}
}
pub fn reverse(list: List<i32>) -> List<i32> {
reverse_impl(list, List::Nil{})
}
$rrc list_reverse.rr -O3 -o list_reverse.o
fingertree.rr
enum FingerTree {
Empty,
Single(Elem),
Deep(Digit, FingerTree, Digit)
}
fn snoc(tree: FingerTree, x: Elem) -> FingerTree {
match tree {
FingerTree::Empty => FingerTree::Single{x},
FingerTree::Single(a) => FingerTree::Deep{
Digit::One{a}, FingerTree::Empty, Digit::One{x}
},
FingerTree::Deep(prefix, middle, Digit::One(a)) =>
FingerTree::Deep{
prefix, middle, Digit::Two{a, x}
},
FingerTree::Deep(prefix, middle, Digit::Two(a, b)) =>
FingerTree::Deep{
prefix, middle, Digit::Three{a, b, x}
},
FingerTree::Deep(prefix, middle,
Digit::Three(a, b, c)) =>
FingerTree::Deep{
prefix, middle, Digit::Four{a, b, c, x}
},
FingerTree::Deep(prefix, middle,
Digit::Four(a, b, c, d)) =>
FingerTree::Deep{
prefix,
snoc(middle, Elem::Node3{a, b, c}),
Digit::Two{d, x}
}
}
}
$rrc fingertree.rr -O3 -o fingertree.o
region.rr
struct [regional] Cell<T> {
value: T
}
regional fn make_cell(x: u64) -> [flex] Cell<u64> {
Cell{value: x}
}
fn freeze_cell() -> Cell<u64> {
regional {
let cell: [flex] Cell<u64> = make_cell(42);
cell
}
}
// Region-local storage freezes into a managed value.
$rrc region.rr --emit mlir -o region.mlir