2010-07-28 00:49:26 -04:00
|
|
|
! Copyright (C) 2008, 2010 Slava Pestov.
|
2008-07-20 05:24:37 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2014-12-13 19:10:21 -05:00
|
|
|
USING: accessors assocs combinators combinators.short-circuit
|
|
|
|
compiler.tree compiler.utilities kernel locals namespaces
|
|
|
|
sequences stack-checker.inlining ;
|
2008-07-20 05:24:37 -04:00
|
|
|
IN: compiler.tree.combinators
|
|
|
|
|
2010-07-28 00:49:26 -04:00
|
|
|
:: each-node ( ... nodes quot: ( ... node -- ... ) -- ... )
|
|
|
|
nodes [
|
|
|
|
quot
|
|
|
|
[
|
|
|
|
{
|
|
|
|
{ [ dup #branch? ] [ children>> [ quot each-node ] each ] }
|
|
|
|
{ [ dup #recursive? ] [ child>> quot each-node ] }
|
|
|
|
{ [ dup #alien-callback? ] [ child>> quot each-node ] }
|
|
|
|
[ drop ]
|
|
|
|
} cond
|
2008-07-27 21:25:42 -04:00
|
|
|
] bi
|
2008-07-30 04:38:10 -04:00
|
|
|
] each ; inline recursive
|
2008-07-27 23:47:40 -04:00
|
|
|
|
2010-07-28 00:49:26 -04:00
|
|
|
:: map-nodes ( ... nodes quot: ( ... node -- ... node' ) -- ... nodes )
|
|
|
|
nodes [
|
|
|
|
quot call
|
|
|
|
{
|
|
|
|
{ [ dup #branch? ] [ [ [ quot map-nodes ] map ] change-children ] }
|
|
|
|
{ [ dup #recursive? ] [ [ quot map-nodes ] change-child ] }
|
|
|
|
{ [ dup #alien-callback? ] [ [ quot map-nodes ] change-child ] }
|
|
|
|
[ ]
|
|
|
|
} cond
|
2008-12-06 12:17:19 -05:00
|
|
|
] map-flat ; inline recursive
|
2008-07-30 04:38:10 -04:00
|
|
|
|
2010-07-28 00:49:26 -04:00
|
|
|
:: contains-node? ( ... nodes quot: ( ... node -- ... ? ) -- ... ? )
|
|
|
|
nodes [
|
|
|
|
{
|
|
|
|
quot
|
|
|
|
[
|
|
|
|
{
|
|
|
|
{ [ dup #branch? ] [ children>> [ quot contains-node? ] any? ] }
|
|
|
|
{ [ dup #recursive? ] [ child>> quot contains-node? ] }
|
|
|
|
{ [ dup #alien-callback? ] [ child>> quot contains-node? ] }
|
|
|
|
[ drop f ]
|
|
|
|
} cond
|
|
|
|
]
|
|
|
|
} 1||
|
2009-01-29 23:19:07 -05:00
|
|
|
] any? ; inline recursive
|
2008-07-30 04:38:10 -04:00
|
|
|
|
|
|
|
: select-children ( seq flags -- seq' )
|
|
|
|
[ [ drop f ] unless ] 2map ;
|
2008-08-01 21:04:36 -04:00
|
|
|
|
2008-08-19 22:48:08 -04:00
|
|
|
: sift-children ( seq flags -- seq' )
|
2012-08-24 01:36:10 -04:00
|
|
|
zip sift-values keys ;
|
2008-08-19 22:48:08 -04:00
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: until-fixed-point ( ... #recursive quot: ( ... node -- ... ) -- ... )
|
2008-08-02 00:31:43 -04:00
|
|
|
over label>> t >>fixed-point drop
|
|
|
|
[ with-scope ] 2keep
|
2015-08-10 13:55:27 -04:00
|
|
|
over label>> fixed-point>>
|
|
|
|
[ 2drop ] [ until-fixed-point ] if ; inline recursive
|