\   Solving Alan Kay's odds-evens problem without mutual recursion. See "Early
\   History of Smalltalk".

Block
    Define (run f)
        (LIST.for_each
            (f [Right "one" & "two" & "three" & "four" & "five" & 'nil])
            STDIO.print_line)
    In
    Begin
        (run odds_evens1)
        (STDIO.print_line "")
        (run odds_evens2)
    End

Where

Define (odds_evens1 items)
    Define (select mode items)
        Unfold {mode items}
            Match items
            | 'nil 'nil
            | 'cons.{item items}
                Match mode
                | 'odds [item & (Fold 'evens items)]
                | 'evens (Fold 'odds items)
                ;
            ;
    In
    (LIST.append (select 'odds items) (select 'evens items))

Define (odds_evens2 items)
    Let {odds evens}
        Define (o item {odds evens}) {[item & odds] evens}
        Define (e item {odds evens}) {odds [item & evens]}
        In
        Unfold {here there items} From {o e items}
            Match items
            | 'nil {'nil 'nil}
            | 'cons.{item items} (here item (Fold there here items))
            ;
    In
    (LIST.append odds evens)

Where

Let LIST Package "list"
Let STDIO Package "stdio"