Singly Linked List

enum List { Empty, Node { value : int; tail : List; } }
func list_add(list : List, value : int) -> List
{
    var l = List::Empty;
    l = list;
    List::Node(value, l)
}
func list_print(list : List) -> int
{
    var node = List::Empty;

    node = list;
    while (node != List::Empty)
    {
        if let (List::Node(value, tail) = node)
        {
            prints(value + "\n");
            node = tail
        }
        else
        {
            node = List::Empty
        }
    }
}
func list_print_rec(list : List) -> int
{
    if let (List::Node(value, tail) = list)
    {
        prints(value + "\n");
        list_print_rec(tail)
    }
    else
    {
        0
    }
}
func list_print_rec_2(list : List) -> int
{
    match (list)
    {
        List::Empty -> 0;
        List::Node(value, tail) -> { prints(value + "\n"); list_print_rec_2(tail) };
    }
}
func main() -> int
{
    var list_rec = List::Node(10, List::Node(20, List::Node(30, List::Node(40, List::Empty))));

    list_print_rec(list_rec);
    list_print_rec_2(list_rec);

    var list = List::Empty;
    list = list_add(list, 40);
    list = list_add(list, 30);
    list = list_add(list, 20);
    list = list_add(list, 10);

    list_print(list);

    0
}