2008-06-03 16:28:02 -04:00
|
|
|
! Copyright (C) 2008 Chris Double & James Cash
|
2008-06-02 01:26:10 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-06-04 00:56:06 -04:00
|
|
|
USING: kernel sequences accessors math arrays vectors classes words ;
|
2008-06-02 01:26:10 -04:00
|
|
|
|
2008-06-03 01:27:06 -04:00
|
|
|
IN: lists
|
2008-06-02 01:26:10 -04:00
|
|
|
|
2008-06-03 16:28:02 -04:00
|
|
|
! List Protocol
|
2008-06-03 03:38:56 -04:00
|
|
|
MIXIN: list
|
|
|
|
GENERIC: car ( cons -- car )
|
|
|
|
GENERIC: cdr ( cons -- cdr )
|
2008-06-04 00:56:06 -04:00
|
|
|
GENERIC: nil? ( cons -- ? )
|
|
|
|
|
2008-06-02 01:26:10 -04:00
|
|
|
TUPLE: cons car cdr ;
|
|
|
|
|
2008-06-03 03:38:56 -04:00
|
|
|
C: cons cons
|
|
|
|
|
|
|
|
M: cons car ( cons -- car )
|
|
|
|
car>> ;
|
|
|
|
|
|
|
|
M: cons cdr ( cons -- cdr )
|
|
|
|
cdr>> ;
|
2008-06-04 00:56:06 -04:00
|
|
|
|
|
|
|
SYMBOL: +nil+
|
|
|
|
M: word nil? +nil+ eq? ;
|
|
|
|
M: object nil? drop f ;
|
2008-06-03 03:38:56 -04:00
|
|
|
|
2008-06-04 00:56:06 -04:00
|
|
|
: nil ( -- +nil+ ) +nil+ ;
|
2008-06-03 23:39:45 -04:00
|
|
|
|
|
|
|
: uncons ( cons -- cdr car )
|
|
|
|
[ cdr ] [ car ] bi ;
|
|
|
|
|
2008-06-03 03:38:56 -04:00
|
|
|
: 1list ( obj -- cons )
|
|
|
|
nil cons ;
|
2008-06-03 16:28:02 -04:00
|
|
|
|
2008-06-03 03:38:56 -04:00
|
|
|
: 2list ( a b -- cons )
|
|
|
|
nil cons cons ;
|
|
|
|
|
|
|
|
: 3list ( a b c -- cons )
|
|
|
|
nil cons cons cons ;
|
|
|
|
|
2008-06-03 16:28:02 -04:00
|
|
|
: 2car ( cons -- car caar )
|
|
|
|
[ car ] [ cdr car ] bi ;
|
|
|
|
|
|
|
|
: 3car ( cons -- car caar caaar )
|
|
|
|
[ car ] [ cdr car ] [ cdr cdr car ] tri ;
|
2008-06-02 01:26:10 -04:00
|
|
|
|
2008-06-03 16:28:02 -04:00
|
|
|
: lnth ( n list -- elt )
|
|
|
|
swap [ cdr ] times car ;
|
|
|
|
|
|
|
|
: (llength) ( list acc -- n )
|
|
|
|
over nil? [ nip ] [ [ cdr ] dip 1+ (llength) ] if ;
|
|
|
|
|
|
|
|
: llength ( list -- n )
|
|
|
|
0 (llength) ;
|
|
|
|
|
|
|
|
: leach ( list quot -- )
|
2008-06-04 00:02:29 -04:00
|
|
|
over nil? [ 2drop ] [ [ uncons swap ] dip tuck [ call ] 2dip leach ] if ; inline
|
2008-06-03 20:11:03 -04:00
|
|
|
|
2008-06-03 16:28:02 -04:00
|
|
|
: lreduce ( list identity quot -- result )
|
2008-06-04 00:02:29 -04:00
|
|
|
swapd leach ; inline
|
2008-06-03 16:28:02 -04:00
|
|
|
|
2008-06-04 00:56:06 -04:00
|
|
|
: (lmap>array) ( acc cons quot -- newcons )
|
2008-06-03 03:38:56 -04:00
|
|
|
over nil? [ 2drop ]
|
2008-06-04 00:56:06 -04:00
|
|
|
[ [ uncons ] dip [ call ] keep swapd [ suffix ] 2dip (lmap>array) ] if ; inline
|
2008-06-02 01:26:10 -04:00
|
|
|
|
2008-06-04 00:56:06 -04:00
|
|
|
: lmap>array ( cons quot -- newcons )
|
|
|
|
{ } -rot (lmap>array) ; inline
|
2008-06-03 20:11:03 -04:00
|
|
|
|
|
|
|
: lmap-as ( cons quot exemplar -- seq )
|
2008-06-04 00:56:06 -04:00
|
|
|
[ lmap>array ] dip like ;
|
2008-06-03 20:11:03 -04:00
|
|
|
|
2008-06-04 01:40:51 -04:00
|
|
|
: lmap ( list quot -- newlist )
|
|
|
|
lmap>array <reversed> nil [ swap cons ] reduce ;
|
|
|
|
|
2008-06-03 20:11:03 -04:00
|
|
|
: same? ( obj1 obj2 -- ? )
|
|
|
|
[ class ] bi@ = ;
|
|
|
|
|
|
|
|
: seq>cons ( seq -- cons )
|
|
|
|
[ <reversed> ] keep nil [ tuck same? [ seq>cons ] when f cons swap >>cdr ] with reduce ;
|
2008-06-02 14:13:48 -04:00
|
|
|
|
2008-06-03 01:27:06 -04:00
|
|
|
: cons>seq ( cons -- array )
|
2008-06-04 00:56:06 -04:00
|
|
|
[ dup cons? [ cons>seq ] when ] lmap>array ;
|
|
|
|
|
|
|
|
: traverse ( list quot -- newlist )
|
2008-06-04 01:40:51 -04:00
|
|
|
[ over list? [ traverse ] [ call ] if ] curry lmap ;
|
2008-06-03 01:27:06 -04:00
|
|
|
|
2008-06-03 03:38:56 -04:00
|
|
|
INSTANCE: cons list
|