Merge branch 'master' of factorcode.org:/git/factor

db4
Eduardo Cavazos 2008-07-24 18:27:50 -05:00
commit 2bed94df39
5 changed files with 107 additions and 33 deletions

View File

@ -2,7 +2,7 @@
! 24, the Factor game! ! 24, the Factor game!
USING: kernel random namespaces shuffle sequences USING: kernel random namespaces shuffle sequences
parser io math prettyprint combinators parser io math prettyprint combinators continuations
vectors words quotations accessors math.parser vectors words quotations accessors math.parser
backtrack math.ranges locals fry memoize macros assocs ; backtrack math.ranges locals fry memoize macros assocs ;

View File

@ -26,11 +26,9 @@ M: true-constraint assume
[ \ f class-not <class-info> swap value>> refine-value-info ] [ \ f class-not <class-info> swap value>> refine-value-info ]
bi ; bi ;
M: true-constraint satisfied? M: true-constraint satisfied? value>> \ f class-not value-is? ;
value>> value-info class>> \ f class-not class<= ;
M: true-constraint satisfiable? M: true-constraint satisfiable? value>> \ f class-not value-is? ;
value>> value-info class>> \ f class-not classes-intersect? ;
TUPLE: false-constraint value ; TUPLE: false-constraint value ;

View File

@ -22,7 +22,8 @@ TUPLE: value-info
{ class initial: null } { class initial: null }
{ interval initial: empty-interval } { interval initial: empty-interval }
literal literal
literal? ; literal?
length ;
: class-interval ( class -- interval ) : class-interval ( class -- interval )
dup real class<= dup real class<=
@ -45,36 +46,54 @@ literal? ;
} cond } cond
] if ; ] if ;
: <value-info> ( class interval literal literal? -- info ) : <value-info> ( -- info ) \ value-info new ;
[
2nip : init-value-info ( info -- info )
[ class ] [ dup real? [ [a,a] ] [ drop [-inf,inf] ] if ] [ ] tri dup literal?>> [
t dup literal>> class >>class
dup literal>> dup real? [ [a,a] ] [ drop [-inf,inf] ] if >>interval
] [ ] [
drop dup [ class>> null class<= ] [ interval>> empty-interval eq? ] bi or [
2dup [ null class<= ] [ empty-interval eq? ] bi* or [ null >>class
2drop null empty-interval f f empty-interval >>interval
] [ ] [
over integer class<= [ integral-closure ] when dup class>> integer class<= [ [ integral-closure ] change-interval ] when
2dup interval>literal dup [ class>> ] [ interval>> ] bi interval>literal
[ >>literal ] [ >>literal? ] bi*
] if ] if
] if ] if ;
\ value-info boa ; foldable
: <class/interval-info> ( class interval -- info ) : <class/interval-info> ( class interval -- info )
f f <value-info> ; foldable <value-info>
swap >>interval
swap >>class
init-value-info ; foldable
: <class-info> ( class -- info ) : <class-info> ( class -- info )
dup word? [ dup +interval+ word-prop ] [ f ] if [-inf,inf] or dup word? [ dup +interval+ word-prop ] [ f ] if [-inf,inf] or
<class/interval-info> ; foldable <class/interval-info> ; foldable
: <interval-info> ( interval -- info ) : <interval-info> ( interval -- info )
real swap <class/interval-info> ; foldable <value-info>
real >>class
swap >>interval
init-value-info ; foldable
: <literal-info> ( literal -- info ) : <literal-info> ( literal -- info )
f f rot t <value-info> ; foldable <value-info>
swap >>literal
t >>literal?
init-value-info ; foldable
: >literal< ( info -- literal literal? ) [ literal>> ] [ literal?>> ] bi ; : <sequence-info> ( value -- info )
<value-info>
object >>class
[-inf,inf] >>interval
swap value-info >>length
init-value-info ; foldable
: >literal< ( info -- literal literal? )
[ literal>> ] [ literal?>> ] bi ;
: intersect-literals ( info1 info2 -- literal literal? ) : intersect-literals ( info1 info2 -- literal literal? )
{ {
@ -84,11 +103,24 @@ literal? ;
[ drop >literal< ] [ drop >literal< ]
} cond ; } cond ;
DEFER: value-info-intersect
: intersect-lengths ( info1 info2 -- length )
[ length>> ] bi@ {
{ [ dup not ] [ drop ] }
{ [ over not ] [ nip ] }
[ value-info-intersect ]
} cond ;
: (value-info-intersect) ( info1 info2 -- info ) : (value-info-intersect) ( info1 info2 -- info )
[ [ class>> ] bi@ class-and ] [ <value-info> ] 2dip
[ [ interval>> ] bi@ interval-intersect ] {
[ intersect-literals ] [ [ class>> ] bi@ class-and >>class ]
2tri <value-info> ; [ [ interval>> ] bi@ interval-intersect >>interval ]
[ intersect-literals [ >>literal ] [ >>literal? ] bi* ]
[ intersect-lengths >>length ]
} 2cleave
init-value-info ;
: value-info-intersect ( info1 info2 -- info ) : value-info-intersect ( info1 info2 -- info )
{ {
@ -102,11 +134,24 @@ literal? ;
[ literal>> ] bi@ 2dup eql? [ drop t ] [ 2drop f f ] if [ literal>> ] bi@ 2dup eql? [ drop t ] [ 2drop f f ] if
] [ 2drop f f ] if ; ] [ 2drop f f ] if ;
DEFER: value-info-union
: union-lengths ( info1 info2 -- length )
[ length>> ] bi@ {
{ [ dup not ] [ nip ] }
{ [ over not ] [ drop ] }
[ value-info-union ]
} cond ;
: (value-info-union) ( info1 info2 -- info ) : (value-info-union) ( info1 info2 -- info )
[ [ class>> ] bi@ class-or ] [ <value-info> ] 2dip
[ [ interval>> ] bi@ interval-union ] {
[ union-literals ] [ [ class>> ] bi@ class-or >>class ]
2tri <value-info> ; [ [ interval>> ] bi@ interval-union >>interval ]
[ union-literals [ >>literal ] [ >>literal? ] bi* ]
[ union-lengths >>length ]
} 2cleave
init-value-info ;
: value-info-union ( info1 info2 -- info ) : value-info-union ( info1 info2 -- info )
{ {
@ -144,3 +189,6 @@ SYMBOL: value-infos
[ { t f } ] [ { t f } ]
} cond nip } cond nip
] if ; ] if ;
: value-is? ( value class -- ? )
[ value-info class>> ] dip class<= ;

View File

@ -2,7 +2,8 @@ USING: kernel compiler.tree.builder compiler.tree
compiler.tree.propagation compiler.tree.copy-equiv compiler.tree.propagation compiler.tree.copy-equiv
compiler.tree.def-use tools.test math math.order compiler.tree.def-use tools.test math math.order
accessors sequences arrays kernel.private vectors accessors sequences arrays kernel.private vectors
alien.accessors alien.c-types sequences.private ; alien.accessors alien.c-types sequences.private
byte-arrays ;
IN: compiler.tree.propagation.tests IN: compiler.tree.propagation.tests
\ propagate must-infer \ propagate must-infer
@ -232,3 +233,9 @@ IN: compiler.tree.propagation.tests
[ V{ 2 } ] [ [ V{ 2 } ] [
[ [ 1 ] [ 1 ] if 1 + ] final-literals [ [ 1 ] [ 1 ] if 1 + ] final-literals
] unit-test ] unit-test
[ V{ t } ] [ [ 10 f <array> length 10 = ] final-literals ] unit-test
[ V{ t } ] [ [ [ 10 f <array> ] [ 10 <byte-array> ] if length 10 = ] final-literals ] unit-test
[ V{ t } ] [ [ [ 1 f <array> ] [ 2 f <array> ] if length 3 < ] final-literals ] unit-test

View File

@ -1,7 +1,8 @@
! Copyright (C) 2008 Slava Pestov. ! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: fry accessors kernel sequences assocs words namespaces USING: fry accessors kernel sequences sequences.private assocs
classes.algebra combinators classes continuations words namespaces classes.algebra combinators classes
continuations arrays byte-arrays strings
compiler.tree compiler.tree
compiler.tree.def-use compiler.tree.def-use
compiler.tree.propagation.info compiler.tree.propagation.info
@ -72,9 +73,29 @@ M: #declare propagate-before
out-d>> length object <class-info> <repetition> out-d>> length object <class-info> <repetition>
] ?if ; ] ?if ;
UNION: fixed-length-sequence array byte-array string ;
: sequence-constructor? ( node -- ? )
word>> { <array> <byte-array> <string> } memq? ;
: propagate-sequence-constructor ( node -- infos )
[ default-output-value-infos first ]
[ in-d>> first <sequence-info> ]
bi value-info-intersect 1array ;
: length-accessor? ( node -- ? )
dup in-d>> first fixed-length-sequence value-is?
[ word>> \ length eq? ] [ drop f ] if ;
: propagate-length ( node -- infos )
in-d>> first value-info length>>
[ array-capacity <class-info> ] unless* 1array ;
: output-value-infos ( node -- infos ) : output-value-infos ( node -- infos )
{ {
{ [ dup foldable-call? ] [ fold-call ] } { [ dup foldable-call? ] [ fold-call ] }
{ [ dup sequence-constructor? ] [ propagate-sequence-constructor ] }
{ [ dup length-accessor? ] [ propagate-length ] }
{ [ dup word>> +outputs+ word-prop ] [ call-outputs-quot ] } { [ dup word>> +outputs+ word-prop ] [ call-outputs-quot ] }
[ default-output-value-infos ] [ default-output-value-infos ]
} cond ; } cond ;