\ 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"