Faster all-words
parent
320ee19b61
commit
ca588599d1
|
@ -2,7 +2,7 @@
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
IN: hashtables-internals
|
IN: hashtables-internals
|
||||||
USING: arrays hashtables kernel kernel-internals math
|
USING: arrays hashtables kernel kernel-internals math
|
||||||
math-internals sequences sequences-internals ;
|
math-internals sequences sequences-internals vectors ;
|
||||||
|
|
||||||
TUPLE: tombstone ;
|
TUPLE: tombstone ;
|
||||||
|
|
||||||
|
@ -108,10 +108,10 @@ TUPLE: tombstone ;
|
||||||
: all-pairs? ( array quot -- ? )
|
: all-pairs? ( array quot -- ? )
|
||||||
swap 0 (all-pairs?) ; inline
|
swap 0 (all-pairs?) ; inline
|
||||||
|
|
||||||
: hash>seq ( i hash -- seq )
|
: (hash-keys/values) ( hash quot -- accum array )
|
||||||
hash-array dup array-capacity 2 /i
|
>r
|
||||||
[ 2 * pick + over array-nth ] map
|
hash-array [ length 2 /i <vector> ] keep
|
||||||
[ tombstone? not ] subset 2nip ;
|
r> each-pair { } like ; inline
|
||||||
|
|
||||||
IN: hashtables
|
IN: hashtables
|
||||||
|
|
||||||
|
@ -177,9 +177,11 @@ IN: hashtables
|
||||||
: associate ( value key -- hash )
|
: associate ( value key -- hash )
|
||||||
2 <hashtable> [ set-hash ] keep ;
|
2 <hashtable> [ set-hash ] keep ;
|
||||||
|
|
||||||
: hash-keys ( hash -- keys ) 0 swap hash>seq ;
|
: hash-keys ( hash -- seq )
|
||||||
|
[ drop over push ] (hash-keys/values) ;
|
||||||
|
|
||||||
: hash-values ( hash -- values ) 1 swap hash>seq ;
|
: hash-values ( hash -- seq )
|
||||||
|
[ nip over push ] (hash-keys/values) ;
|
||||||
|
|
||||||
: hash>alist ( hash -- alist )
|
: hash>alist ( hash -- alist )
|
||||||
dup hash-keys swap hash-values 2array flip ;
|
dup hash-keys swap hash-values 2array flip ;
|
||||||
|
|
|
@ -86,11 +86,6 @@ HELP: ?grow-hash
|
||||||
{ $see-also (set-hash) grow-hash set-hash }
|
{ $see-also (set-hash) grow-hash set-hash }
|
||||||
{ $side-effects "hash" } ;
|
{ $side-effects "hash" } ;
|
||||||
|
|
||||||
HELP: hash>seq
|
|
||||||
{ $values { "i" "0 or 1" } { "hash" "a hashtable" } { "seq" "a sequence of keys or values" } }
|
|
||||||
{ $description "User code should not call this word. It is unsafe and only used in the implementation of " { $link hash-keys } " and " { $link hash-values } ", both of which are safe." }
|
|
||||||
{ $warning "This word is in the " { $vocab-link "hashtables-internals" } " vocabulary because passing an invalid value for " { $snippet "i" } " can lead to memory corruption." } ;
|
|
||||||
|
|
||||||
HELP: <hashtable>
|
HELP: <hashtable>
|
||||||
{ $values { "n" "a positive integer specifying hashtable capacity" } { "hash" "a new hashtable" } }
|
{ $values { "n" "a positive integer specifying hashtable capacity" } { "hash" "a new hashtable" } }
|
||||||
{ $description "Create a new hashtable capable of storing " { $snippet "n" } " key/value pairs before growing." }
|
{ $description "Create a new hashtable capable of storing " { $snippet "n" } " key/value pairs before growing." }
|
||||||
|
|
|
@ -62,8 +62,5 @@ SYMBOL: building
|
||||||
|
|
||||||
IN: sequences
|
IN: sequences
|
||||||
|
|
||||||
: concat ( seq -- newseq )
|
|
||||||
dup empty? [ [ [ % ] each ] over first make ] unless ;
|
|
||||||
|
|
||||||
: join ( seq glue -- newseq )
|
: join ( seq glue -- newseq )
|
||||||
[ swap [ % ] [ dup % ] interleave drop ] over make ;
|
[ swap [ % ] [ dup % ] interleave drop ] over make ;
|
||||||
|
|
|
@ -123,12 +123,6 @@ HELP: init-namespaces
|
||||||
{ $code "[ init-namestack do-some-work ] in-thread" }
|
{ $code "[ init-namestack do-some-work ] in-thread" }
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
HELP: concat
|
|
||||||
{ $values { "seq" "a sequence" } { "newseq" "a sequence" } }
|
|
||||||
{ $description "Concatenates a sequence of sequences together into one sequence. The resulting sequence is of the same class as the first element of " { $snippet "seq" } "." }
|
|
||||||
{ $errors "Throws an error if one of the sequences in " { $snippet "seq" } " contains elements not permitted in sequences of the same class as the first element of " { $snippet "seq" } "." }
|
|
||||||
{ $see-also join } ;
|
|
||||||
|
|
||||||
HELP: join
|
HELP: join
|
||||||
{ $values { "seq" "a sequence" } { "glue" "a sequence" } { "newseq" "a sequence" } }
|
{ $values { "seq" "a sequence" } { "glue" "a sequence" } { "newseq" "a sequence" } }
|
||||||
{ $description "Concatenates a sequence of sequences together into one sequence, placing a copy of " { $snippet "glue" } " between each pair of sequences. The resulting sequence is of the same class as " { $snippet "glue" } "." }
|
{ $description "Concatenates a sequence of sequences together into one sequence, placing a copy of " { $snippet "glue" } " between each pair of sequences. The resulting sequence is of the same class as " { $snippet "glue" } "." }
|
||||||
|
|
|
@ -88,6 +88,13 @@ sequences-internals strings vectors words ;
|
||||||
|
|
||||||
: add* ( seq elt -- newseq ) 1array swap dup (append) ; inline
|
: add* ( seq elt -- newseq ) 1array swap dup (append) ; inline
|
||||||
|
|
||||||
|
: concat ( seq -- newseq )
|
||||||
|
dup empty? [
|
||||||
|
[ 0 [ length + ] accumulate ] keep
|
||||||
|
rot over first new -rot
|
||||||
|
[ >r over r> copy-into ] 2each
|
||||||
|
] unless ;
|
||||||
|
|
||||||
: diff ( seq1 seq2 -- newseq )
|
: diff ( seq1 seq2 -- newseq )
|
||||||
[ swap member? not ] subset-with ;
|
[ swap member? not ] subset-with ;
|
||||||
|
|
||||||
|
|
|
@ -124,6 +124,12 @@ HELP: append3
|
||||||
{ $description "Outputs a new sequence consisting of the elements of " { $snippet "seq1" } ", " { $snippet "seq2" } " and " { $snippet "seq3" } " in turn." }
|
{ $description "Outputs a new sequence consisting of the elements of " { $snippet "seq1" } ", " { $snippet "seq2" } " and " { $snippet "seq3" } " in turn." }
|
||||||
{ $errors "Throws an error if " { $snippet "seq2" } " or " { $snippet "seq3" } " contain elements not permitted in sequences of the same class as " { $snippet "seq1" } "." } ;
|
{ $errors "Throws an error if " { $snippet "seq2" } " or " { $snippet "seq3" } " contain elements not permitted in sequences of the same class as " { $snippet "seq1" } "." } ;
|
||||||
|
|
||||||
|
HELP: concat
|
||||||
|
{ $values { "seq" "a sequence" } { "newseq" "a sequence" } }
|
||||||
|
{ $description "Concatenates a sequence of sequences together into one sequence. The resulting sequence is of the same class as the first element of " { $snippet "seq" } "." }
|
||||||
|
{ $errors "Throws an error if one of the sequences in " { $snippet "seq" } " contains elements not permitted in sequences of the same class as the first element of " { $snippet "seq" } "." }
|
||||||
|
{ $see-also join } ;
|
||||||
|
|
||||||
HELP: peek
|
HELP: peek
|
||||||
{ $values { "seq" "a sequence" } { "elt" "an object" } }
|
{ $values { "seq" "a sequence" } { "elt" "an object" } }
|
||||||
{ $description "Outputs the last element of a sequence." }
|
{ $description "Outputs the last element of a sequence." }
|
||||||
|
|
|
@ -144,7 +144,8 @@ SYMBOL: bootstrapping?
|
||||||
|
|
||||||
: words ( vocab -- seq ) vocab dup [ hash-values ] when ;
|
: words ( vocab -- seq ) vocab dup [ hash-values ] when ;
|
||||||
|
|
||||||
: all-words ( -- seq ) vocabs [ words ] map concat ;
|
: all-words ( -- seq )
|
||||||
|
vocabularies get hash-values [ hash-values ] map concat ;
|
||||||
|
|
||||||
: word-subset ( quot -- seq )
|
: word-subset ( quot -- seq )
|
||||||
all-words swap subset ; inline
|
all-words swap subset ; inline
|
||||||
|
|
Loading…
Reference in New Issue