Crazy J/Reverse input

From Esolang
Jump to navigation Jump to search

Crazy J examples

Reverse input

One more exercise before serious work.

   init_list  = λ v g f . f v g = V
   
   push_front = λ v l g f . f v (l g) = D V
   
   reverse = λ1 input . input (Y (λ2 self l g ch tail . ch T (λ3 g1 g2 . tail (self (push_front ch l) (g2 g1)))
                                                      (256 T (Q1 l)) g)
                                 (init_list EOF)
                                 I
                              )

init_list and push_front primitives are designed not only to provide an access to stored items but also to pass garbage through and put it finally after the last element (the one put first).

Lambdas are marked with indices to reference them from the following explanation text:

  • λ3 packs lumps of garbage and makes recursive call of λ2 by passing self as a parameter to tail.
  • λ2 is called to handle each character of input. First parameter (self) is provided by Y, l (currently accumulated reversed list) and g (garbage) - by λ3 (recursive call) or by λ1 (topmost call), ch and tail - by input list element.
  • λ1 is an entry point which provides initial values for accumulated list and garbage.

Compiled program:

```jii````````j``j`j`j```j``j`jiii``jiii``jiiji`````j`j`j`j``jiii``jiji``j`jii`````j``jii``ji``jii`j`j``jii````j``ji``j`j``jiii`j``jii`jij```j``jii``````j`j``jii``ji``jii``ji`j`j``jii````j```jii````j```jii```j``ji``j``jiii``jii``jijii``jiiii``jii``jii`ji````j`j``jii``ji``jii``ji`j`j``jii`````j``jii``ji``jii`j`j``jii```j``jii`j``jii`j``jii`````j``jii``ji``jii`j`j``jii``````j```jj``j```jiiii`j``jiiiij```j``jii`j`j``jii`j``jii`````j```jj``j```jiiii`j``jiiiij```j``jii`j`j``jii`j``jii````j``jii`j`j``jii`j``jii`````j``ji``j`j``jiii`j``jii`jij`````j``jii`j``jii`j``jii`````j``jii``ji``jii`j`j``jii````j```jj``j```jiiii`j``jiiiij```ji````j```jj``j```jiiii`j``jiiiij``jii``````j```jj``j```jiiii`j``jiiiij````j``jii`j`j``jii`j``jii`````j``jii``ji``jii`j`j``jii`````j```jj``j```jiiii`j``jiiiij`ji````j```jj``j```jiiii`j``jiiiij````j`j``jii``ji``jii``ji`j`j``jii```j``j```jii`j`j``jii``jiiij````j``j```jii`j`j``jii``jiiij`````j``ji``j`j``jiii`j``jii`jij````j`j``jii``ji``jii``ji`j`j``jii````j```jii````j```jii```j``ji``j``jiii``jii``jijii``jiiii``jiii