\   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)
        Define (rec rec mode items)
            Match items
            | 'nil 'nil
            | 'cons.{item items}
                Match mode
                | 'odds [item & (rec rec 'evens items)]
                | 'evens (rec rec 'odds items)
                ;
            ;
        In
        (rec rec mode items)
    In
    (LIST.append (select 'odds items) (select 'evens items))

Define (odds_evens2 items)
    Let {odds evens}
        For (rec rec
                Func {item {odds evens}} {[item & odds] evens}
                Func {item {odds evens}} {odds [item & evens]}
                items)
            Define (rec rec here there items)
                Match items
                | 'nil {'nil 'nil}
                | 'cons.{item items} (here item (rec rec there here items))
                ;
    In
    (LIST.append odds evens)

Where

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