2007-11-14 18:32:06 -05:00
|
|
|
|
2008-02-23 16:51:10 -05:00
|
|
|
USING: kernel sequences macros ;
|
2007-11-14 18:32:06 -05:00
|
|
|
|
|
|
|
IN: combinators.cleave
|
|
|
|
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
! The cleaver family
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
|
2008-03-12 12:57:11 -04:00
|
|
|
: bi ( x p q -- p(x) q(x) ) >r keep r> call ; inline
|
|
|
|
: tri ( x p q r -- p(x) q(x) r(x) ) >r pick >r bi r> r> call ; inline
|
2007-11-14 18:32:06 -05:00
|
|
|
|
|
|
|
: tetra ( obj quot quot quot quot -- val val val val )
|
|
|
|
>r >r pick >r bi r> r> r> bi ; inline
|
|
|
|
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
|
2008-03-13 17:39:25 -04:00
|
|
|
: 2bi ( x y p q -- p(x,y) q(x,y) ) >r 2keep r> call ; inline
|
2007-11-14 18:32:06 -05:00
|
|
|
|
2008-03-13 17:39:25 -04:00
|
|
|
: 2tri ( x y z p q r -- p(x,y,z) q(x,y,z) r(x,y,z) )
|
2008-03-13 04:41:57 -04:00
|
|
|
>r >r 2keep r> 2keep r> call ; inline
|
|
|
|
|
2008-02-23 16:51:10 -05:00
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
|
|
|
|
! General cleave
|
|
|
|
|
|
|
|
MACRO: cleave ( seq -- )
|
|
|
|
dup
|
|
|
|
[ drop [ dup ] ] map concat
|
|
|
|
swap
|
|
|
|
dup
|
|
|
|
[ drop [ >r ] ] map concat
|
|
|
|
swap
|
|
|
|
[ [ r> ] append ] map concat
|
|
|
|
3append
|
|
|
|
[ drop ]
|
|
|
|
append ;
|
|
|
|
|
2008-03-13 17:39:25 -04:00
|
|
|
MACRO: 2cleave ( seq -- )
|
|
|
|
dup
|
|
|
|
[ drop [ 2dup ] ] map concat
|
|
|
|
swap
|
|
|
|
dup
|
|
|
|
[ drop [ >r >r ] ] map concat
|
|
|
|
swap
|
|
|
|
[ [ r> r> ] append ] map concat
|
|
|
|
3append
|
|
|
|
[ 2drop ]
|
|
|
|
append ;
|
|
|
|
|
2007-11-14 18:32:06 -05:00
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
! The spread family
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
|
2008-03-12 12:57:11 -04:00
|
|
|
: bi* ( x y p q -- p(x) q(y) ) >r swap slip r> call ; inline
|
2007-11-14 18:32:06 -05:00
|
|
|
|
2008-03-12 12:57:11 -04:00
|
|
|
: tri* ( x y z p q r -- p(x) q(y) r(z) )
|
2007-11-14 18:32:06 -05:00
|
|
|
>r rot >r bi* r> r> call ; inline
|
|
|
|
|
|
|
|
: tetra* ( obj obj obj obj quot quot quot quot -- val val val val )
|
|
|
|
>r roll >r tri* r> r> call ; inline
|
2008-02-23 15:22:04 -05:00
|
|
|
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
|
|
|
|
! General spread
|
|
|
|
|
|
|
|
MACRO: spread ( seq -- )
|
|
|
|
dup
|
|
|
|
[ drop [ >r ] ] map concat
|
|
|
|
swap
|
|
|
|
[ [ r> ] swap append ] map concat
|
|
|
|
append ;
|