149 lines
3.0 KiB
Factor
149 lines
3.0 KiB
Factor
IN: temporary
|
|
USING: tools.test optimizer.control combinators kernel
|
|
sequences inference.dataflow math inference classes strings
|
|
optimizer ;
|
|
|
|
: label-is-loop? ( node word -- ? )
|
|
[
|
|
{
|
|
{ [ over #label? not ] [ 2drop f ] }
|
|
{ [ over #label-word over eq? not ] [ 2drop f ] }
|
|
{ [ over #label-loop? not ] [ 2drop f ] }
|
|
{ [ t ] [ 2drop t ] }
|
|
} cond
|
|
] curry node-exists? ;
|
|
|
|
: label-is-not-loop? ( node word -- ? )
|
|
[
|
|
{
|
|
{ [ over #label? not ] [ 2drop f ] }
|
|
{ [ over #label-word over eq? not ] [ 2drop f ] }
|
|
{ [ over #label-loop? ] [ 2drop f ] }
|
|
{ [ t ] [ 2drop t ] }
|
|
} cond
|
|
] curry node-exists? ;
|
|
|
|
: loop-test-1 ( a -- )
|
|
dup [ 1+ loop-test-1 ] [ drop ] if ; inline
|
|
|
|
[ t ] [
|
|
[ loop-test-1 ] dataflow dup detect-loops
|
|
\ loop-test-1 label-is-loop?
|
|
] unit-test
|
|
|
|
[ t ] [
|
|
[ loop-test-1 1 2 3 ] dataflow dup detect-loops
|
|
\ loop-test-1 label-is-loop?
|
|
] unit-test
|
|
|
|
[ t ] [
|
|
[ [ loop-test-1 ] each ] dataflow dup detect-loops
|
|
\ loop-test-1 label-is-loop?
|
|
] unit-test
|
|
|
|
[ t ] [
|
|
[ [ loop-test-1 ] each ] dataflow dup detect-loops
|
|
\ (each-integer) label-is-loop?
|
|
] unit-test
|
|
|
|
: loop-test-2 ( a -- )
|
|
dup [ 1+ loop-test-2 1- ] [ drop ] if ; inline
|
|
|
|
[ t ] [
|
|
[ loop-test-2 ] dataflow dup detect-loops
|
|
\ loop-test-2 label-is-not-loop?
|
|
] unit-test
|
|
|
|
: loop-test-3 ( a -- )
|
|
dup [ [ loop-test-3 ] each ] [ drop ] if ; inline
|
|
|
|
[ t ] [
|
|
[ loop-test-3 ] dataflow dup detect-loops
|
|
\ loop-test-3 label-is-not-loop?
|
|
] unit-test
|
|
|
|
: loop-test-4 ( a -- )
|
|
dup [
|
|
loop-test-4
|
|
] [
|
|
drop
|
|
] if ; inline
|
|
|
|
: find-label ( node -- label )
|
|
dup #label? [ node-successor find-label ] unless ;
|
|
|
|
: test-loop-exits
|
|
dataflow dup detect-loops find-label
|
|
dup node-param swap
|
|
[ node-child find-tail find-loop-exits [ class ] map ] keep
|
|
#label-loop? ;
|
|
|
|
[ { #values } t ] [
|
|
[ loop-test-4 ] test-loop-exits
|
|
] unit-test
|
|
|
|
: loop-test-5 ( a -- )
|
|
dup [
|
|
dup string? [
|
|
loop-test-5
|
|
] [
|
|
drop
|
|
] if
|
|
] [
|
|
drop
|
|
] if ; inline
|
|
|
|
[ { #values #values } t ] [
|
|
[ loop-test-5 ] test-loop-exits
|
|
] unit-test
|
|
|
|
: loop-test-6 ( a -- )
|
|
dup [
|
|
dup string? [
|
|
loop-test-6
|
|
] [
|
|
3 throw
|
|
] if
|
|
] [
|
|
drop
|
|
] if ; inline
|
|
|
|
[ { #values } t ] [
|
|
[ loop-test-6 ] test-loop-exits
|
|
] unit-test
|
|
|
|
[ f ] [
|
|
[ [ [ ] map ] map ] dataflow optimize
|
|
[ dup #label? swap #loop? not and ] node-exists?
|
|
] unit-test
|
|
|
|
: blah f ;
|
|
|
|
DEFER: a
|
|
|
|
: b ( -- )
|
|
blah [ b ] [ a ] if ; inline
|
|
|
|
: a ( -- )
|
|
blah [ b ] [ a ] if ; inline
|
|
|
|
[ t ] [
|
|
[ a ] dataflow dup detect-loops
|
|
\ a label-is-loop?
|
|
] unit-test
|
|
|
|
[ t ] [
|
|
[ a ] dataflow dup detect-loops
|
|
\ b label-is-loop?
|
|
] unit-test
|
|
|
|
[ t ] [
|
|
[ b ] dataflow dup detect-loops
|
|
\ a label-is-loop?
|
|
] unit-test
|
|
|
|
[ t ] [
|
|
[ a ] dataflow dup detect-loops
|
|
\ b label-is-loop?
|
|
] unit-test
|