Making propagation and tuple.parser refer to new-sets; adding some missing features from sets into new-sets
parent
e43312d780
commit
b76c82048d
|
@ -8,7 +8,7 @@ layouts compiler.tree.propagation.info compiler.tree.def-use
|
||||||
compiler.tree.debugger compiler.tree.checker slots.private words
|
compiler.tree.debugger compiler.tree.checker slots.private words
|
||||||
hashtables classes assocs locals specialized-arrays system
|
hashtables classes assocs locals specialized-arrays system
|
||||||
sorting math.libm math.floats.private math.integers.private
|
sorting math.libm math.floats.private math.integers.private
|
||||||
math.intervals quotations effects alien alien.data sets ;
|
math.intervals quotations effects alien alien.data new-sets ;
|
||||||
FROM: math => float ;
|
FROM: math => float ;
|
||||||
SPECIALIZED-ARRAY: double
|
SPECIALIZED-ARRAY: double
|
||||||
SPECIALIZED-ARRAY: void*
|
SPECIALIZED-ARRAY: void*
|
||||||
|
|
|
@ -3,12 +3,13 @@
|
||||||
USING: alien.c-types kernel sequences words fry generic accessors
|
USING: alien.c-types kernel sequences words fry generic accessors
|
||||||
classes.tuple classes classes.algebra definitions
|
classes.tuple classes classes.algebra definitions
|
||||||
stack-checker.dependencies quotations classes.tuple.private math
|
stack-checker.dependencies quotations classes.tuple.private math
|
||||||
math.partial-dispatch math.private math.intervals sets.private
|
math.partial-dispatch math.private math.intervals new-sets.private
|
||||||
math.floats.private math.integers.private layouts math.order
|
math.floats.private math.integers.private layouts math.order
|
||||||
vectors hashtables combinators effects generalizations assocs
|
vectors hashtables combinators effects generalizations assocs
|
||||||
sets combinators.short-circuit sequences.private locals growable
|
new-sets combinators.short-circuit sequences.private locals growable
|
||||||
stack-checker namespaces compiler.tree.propagation.info ;
|
stack-checker namespaces compiler.tree.propagation.info ;
|
||||||
FROM: math => float ;
|
FROM: math => float ;
|
||||||
|
FROM: new-sets => set ;
|
||||||
IN: compiler.tree.propagation.transforms
|
IN: compiler.tree.propagation.transforms
|
||||||
|
|
||||||
\ equal? [
|
\ equal? [
|
||||||
|
@ -207,7 +208,7 @@ ERROR: bad-partial-eval quot word ;
|
||||||
[ drop f ] swap
|
[ drop f ] swap
|
||||||
[ literalize [ t ] ] { } map>assoc linear-case-quot
|
[ literalize [ t ] ] { } map>assoc linear-case-quot
|
||||||
] [
|
] [
|
||||||
unique [ key? ] curry
|
tester
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
\ member? [
|
\ member? [
|
||||||
|
@ -272,14 +273,14 @@ CONSTANT: lookup-table-at-max 256
|
||||||
\ at* [ at-quot ] 1 define-partial-eval
|
\ at* [ at-quot ] 1 define-partial-eval
|
||||||
|
|
||||||
: diff-quot ( seq -- quot: ( seq' -- seq'' ) )
|
: diff-quot ( seq -- quot: ( seq' -- seq'' ) )
|
||||||
tester '[ [ @ not ] filter ] ;
|
tester '[ [ [ @ not ] filter ] keep set-like ] ;
|
||||||
|
|
||||||
\ diff [ diff-quot ] 1 define-partial-eval
|
M\ set diff [ diff-quot ] 1 define-partial-eval
|
||||||
|
|
||||||
: intersect-quot ( seq -- quot: ( seq' -- seq'' ) )
|
: intersect-quot ( seq -- quot: ( seq' -- seq'' ) )
|
||||||
tester '[ _ filter ] ;
|
tester '[ [ _ filter ] keep set-like ] ;
|
||||||
|
|
||||||
\ intersect [ intersect-quot ] 1 define-partial-eval
|
M\ set intersect [ intersect-quot ] 1 define-partial-eval
|
||||||
|
|
||||||
: fixnum-bits ( -- n )
|
: fixnum-bits ( -- n )
|
||||||
cell-bits tag-bits get - ;
|
cell-bits tag-bits get - ;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2008, 2010 Slava Pestov.
|
! Copyright (C) 2008, 2010 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors kernel sets namespaces make sequences parser
|
USING: accessors kernel new-sets namespaces make sequences parser
|
||||||
lexer combinators words classes.parser classes.tuple arrays
|
lexer combinators words classes.parser classes.tuple arrays
|
||||||
slots math assocs parser.notes classes classes.algebra ;
|
slots math assocs parser.notes classes classes.algebra ;
|
||||||
IN: classes.tuple.parser
|
IN: classes.tuple.parser
|
||||||
|
|
|
@ -22,3 +22,6 @@ M: hash-set clone
|
||||||
table>> clone hash-set boa ;
|
table>> clone hash-set boa ;
|
||||||
|
|
||||||
M: sequence fast-set <hash-set> ;
|
M: sequence fast-set <hash-set> ;
|
||||||
|
|
||||||
|
M: sequence duplicates
|
||||||
|
HS{ } clone [ [ in? ] [ adjoin ] 2bi ] curry filter ;
|
||||||
|
|
|
@ -40,3 +40,12 @@ IN: new-sets.tests
|
||||||
[ HS{ 1 2 3 } ] [ { 1 2 3 } fast-set ] unit-test
|
[ HS{ 1 2 3 } ] [ { 1 2 3 } fast-set ] unit-test
|
||||||
|
|
||||||
[ { 1 2 3 } ] [ { { 1 } { 2 } { 1 3 } } combine ] unit-test
|
[ { 1 2 3 } ] [ { { 1 } { 2 } { 1 3 } } combine ] unit-test
|
||||||
|
|
||||||
|
[ f ] [ { 0 1 1 2 3 5 } all-unique? ] unit-test
|
||||||
|
[ t ] [ { 0 1 2 3 4 5 } all-unique? ] unit-test
|
||||||
|
|
||||||
|
[ { 1 2 3 } ] [ { 1 2 2 3 3 } { } set-like ] unit-test
|
||||||
|
[ { 3 2 1 } ] [ { 3 3 2 2 1 } { } set-like ] unit-test
|
||||||
|
|
||||||
|
[ { 1 2 1 } ] [ { 1 2 3 2 1 2 1 } duplicates ] unit-test
|
||||||
|
[ f ] [ HS{ 1 2 3 1 2 1 } duplicates ] unit-test
|
||||||
|
|
|
@ -1,11 +1,8 @@
|
||||||
! Copyright (C) 2010 Daniel Ehrenberg
|
! Copyright (C) 2010 Daniel Ehrenberg
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors assocs hashtables kernel
|
USING: accessors assocs hashtables kernel vectors
|
||||||
math sequences ;
|
math sequences ;
|
||||||
FROM: sets => prune ;
|
|
||||||
IN: new-sets
|
IN: new-sets
|
||||||
! The vocab is called new-sets for now, but only until it gets into core
|
|
||||||
! All the code here is in the style that could be put in core
|
|
||||||
|
|
||||||
! Set protocol
|
! Set protocol
|
||||||
MIXIN: set
|
MIXIN: set
|
||||||
|
@ -21,6 +18,8 @@ GENERIC: intersects? ( set1 set2 -- ? )
|
||||||
GENERIC: diff ( set1 set2 -- set )
|
GENERIC: diff ( set1 set2 -- set )
|
||||||
GENERIC: subset? ( set1 set2 -- ? )
|
GENERIC: subset? ( set1 set2 -- ? )
|
||||||
GENERIC: set= ( set1 set2 -- ? )
|
GENERIC: set= ( set1 set2 -- ? )
|
||||||
|
GENERIC: duplicates ( set -- sequence )
|
||||||
|
GENERIC: all-unique? ( set -- ? )
|
||||||
|
|
||||||
! Defaults for some methods.
|
! Defaults for some methods.
|
||||||
! Override them for efficiency
|
! Override them for efficiency
|
||||||
|
@ -30,8 +29,11 @@ M: set union
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
|
: tester ( set -- quot )
|
||||||
|
fast-set [ in? ] curry ; inline
|
||||||
|
|
||||||
: sequence/tester ( set1 set2 -- set1' quot )
|
: sequence/tester ( set1 set2 -- set1' quot )
|
||||||
[ members ] [ fast-set [ in? ] curry ] bi* ; inline
|
[ members ] [ tester ] bi* ; inline
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
@ -52,15 +54,45 @@ M: set set=
|
||||||
|
|
||||||
M: set fast-set ;
|
M: set fast-set ;
|
||||||
|
|
||||||
|
M: set duplicates drop f ;
|
||||||
|
|
||||||
|
M: set all-unique? drop t ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: (prune) ( elt hash vec -- )
|
||||||
|
3dup drop key? [ 3drop ] [
|
||||||
|
[ drop dupd set-at ] [ nip push ] 3bi
|
||||||
|
] if ; inline
|
||||||
|
|
||||||
|
: prune ( seq -- newseq )
|
||||||
|
[ ] [ length <hashtable> ] [ length <vector> ] tri
|
||||||
|
[ [ (prune) ] 2curry each ] keep ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
! Sequences are sets
|
! Sequences are sets
|
||||||
INSTANCE: sequence set
|
INSTANCE: sequence set
|
||||||
M: sequence in? member? ; inline
|
|
||||||
M: sequence adjoin [ delete ] [ push ] 2bi ;
|
|
||||||
M: sequence delete remove! drop ; inline
|
|
||||||
M: sequence set-like
|
|
||||||
[ dup sequence? [ prune ] [ members ] if ] dip like ;
|
|
||||||
M: sequence members fast-set members ;
|
|
||||||
|
|
||||||
|
M: sequence in?
|
||||||
|
member? ; inline
|
||||||
|
|
||||||
|
M: sequence adjoin
|
||||||
|
[ delete ] [ push ] 2bi ;
|
||||||
|
|
||||||
|
M: sequence delete
|
||||||
|
remove! drop ; inline
|
||||||
|
|
||||||
|
M: sequence set-like
|
||||||
|
[ members ] dip like ;
|
||||||
|
|
||||||
|
M: sequence members
|
||||||
|
[ prune ] keep like ;
|
||||||
|
|
||||||
|
M: sequence all-unique?
|
||||||
|
dup prune sequence= ;
|
||||||
|
|
||||||
|
! Some sequence methods are defined using hash-sets
|
||||||
USE: vocabs.loader
|
USE: vocabs.loader
|
||||||
"hash-sets" require
|
"hash-sets" require
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue