// joy combinators ; i / ; ; x dup i ; ; b { [p q] p i q i } ; ; y [dup cons] swap , dup cons i ; ; cleave { [x p q] x p i x q i } ; ; construct { [p P] } ; ; slip => / <= ; ; 2slip => => / <= <= ; ; dip swap slip ; ; 2dip -rot 2slip ; ; ifte { [c t e] [e t] _x c infra* true? @ i } ; ; if pair swap zero? @ i ; ; branch [] if ; ; cond { [a] a #: 1 = [a *: i] [_x <- a cond.] if } ; ; cond. { [[[b T] A]] b T [A cond] ifte } ; ; infra { [a p] a @: [a p i] [S/ a <- p i S\] if } ; ; infra* infra |: *: ; ; unary { [n p] G\ n -: #. p map _x n -: _. swap , <- } ; // list [p] map // ; map { [a p] a @: [[a] p _z i] [[] a [_x p map.] step |:] if } ; // ; map. { [r a x p] x a p cons infra -uncons pop r cons } ; ; map [jump] [each* rot => map <= swons] [pop] ifte ; ; each* => uncons <= tuck 2slip ; ; filter { [a p] a p map &: a @. } ; ; split { [a p] a p map dup ~: pair a swap [&: @] each/ i } ; ; some? { [a p] a p map 1 swap _in } ; ; all? { [a p] a p map 0 swap _in ~: } ; ; step { [a p] a [a uncons p dip p _z] branch } ; ; fold [swap] dip step ; ; fold! { [a s p] S/ a s p fold!. S\ } ; ; fold!. { [a s p] a [s 1 a _ s a *: p i p _z] [s] if } ; ; linrec { [c t r s] c i c t r s _x linrec. } ; ; linrec. { [b c t r s x] x <- b t [r i c t r s linrec s i] if } ; ; tailrec [] linrec ; ; binrec { [p t r s] p i p t r s _x binrec. } ; ; binrec. { [b p t r s x] x <- b t [r i p t r s binrec.. s i] if } ; ; binrec.. { [a b p t r s] a p t r s binrec b p t r s binrec } ; ; genrec { [p t r s] p i p t r s _x genrec. } ; ; genrec. { [b p t r s x] x <- b t [r i p t r s genrec s i] if } ; ; primrec { [n p c] p i 1 n 1 + c primrec. } ; ; primrec. { [k n c] k n = [] [k c i k 1 + n c _z] if } ; ; primrec- [zero?] -rot swap [pop] swap , swap [dup pred] swap linrec ; ; condlinrec -uncons [condlinrec.] map -cons cond ; ; condlinrec. ; ; condnestrec ; ; treestep ; ; treerec ; ; treegenrec ; // nested-list [monad] pervade1 ; pervade1 { [t m] t @: [t m i] [t [m _z] map] if } ; // nested-list nested-list [dyad] pervade2 ; pervade2 { [t u d] t @: u @: & [t u d i] [[t u] +: [[d _z] infra i] map] if } ;