--- gforth/hash.fs 1994/09/12 19:00:31 1.3 +++ gforth/hash.fs 1994/11/15 15:55:36 1.5 @@ -1,19 +1,18 @@ \ Hashed dictionaries 15jul94py -7 value hashbits +9 value hashbits 1 hashbits lshift Value Hashlen Variable insRule insRule on +Variable revealed -\ Memory handling 15jul94py +\ Memory handling 10oct94py Variable HashPointer +Variable HashTable +Variable HashIndex -: hash-alloc ( addr -- addr ) dup @ 0= IF - Hashlen cells allocate throw over ! - dup @ Hashlen cells erase THEN ; - -\ DelFix and NewFix is from bigFORTH 15jul94py +\ DelFix and NewFix are from bigFORTH 15jul94py : DelFix ( addr root -- ) dup @ 2 pick ! ! ; : NewFix ( root len # -- addr ) @@ -31,7 +30,7 @@ Variable HashPointer : hash-find ( addr len wordlist -- nfa / false ) $C + @ >r - 2dup hash cells r> + @ (hashfind) ; + 2dup hash r> xor cells HashTable @ + @ (hashfind) ; \ hash vocabularies 16jul94py @@ -39,37 +38,67 @@ Variable HashPointer BEGIN dup @ dup WHILE nip REPEAT drop ! ; : (reveal ( addr voc -- ) $C + dup @ 0< IF 2drop EXIT THEN - hash-alloc @ over cell+ count $1F and Hash cells + >r + @ over cell+ count $1F and Hash xor cells >r HashPointer 8 $400 NewFix - tuck cell+ ! r> insRule @ - IF dup @ 2 pick ! ! ELSE lastlink! THEN ; + tuck cell+ ! r> HashTable @ + insRule @ + IF dup @ 2 pick ! ! ELSE lastlink! THEN revealed on ; : hash-reveal ( -- ) (reveal) last? IF current @ (reveal THEN ; -Create hashsearch ' hash-find A, ' hash-reveal A, ' drop A, +: addall ( -- ) + voclink + BEGIN @ dup @ WHILE dup 'initvoc REPEAT drop ; + +: clearhash ( -- ) + HashTable @ Hashlen cells bounds + DO I @ + BEGIN dup WHILE + dup @ swap HashPointer DelFix + REPEAT I ! + cell +LOOP HashIndex off ; + +: rehash clearhash addall ; +: (rehash) ( addr -- ) + drop revealed @ IF rehash revealed off THEN ; + +Create hashsearch ' hash-find A, ' hash-reveal A, ' (rehash) A, + +\ hash allocate and vocabulary initialization 10oct94py + +: hash-alloc ( addr -- addr ) HashTable @ 0= IF + Hashlen cells allocate throw HashTable ! + HashTable @ Hashlen cells erase THEN + HashIndex @ over ! 1 HashIndex +! + HashIndex @ Hashlen >= + IF clearhash + 1 hashbits 1+ dup to hashbits lshift to hashlen + HashTable @ free + addall + THEN ; -: (initvoc ( addr -- ) +: (initvoc) ( addr -- ) cell+ dup @ 0< IF drop EXIT THEN insRule @ >r insRule off hash-alloc 3 cells - hashsearch over cell+ ! dup BEGIN @ dup WHILE 2dup swap (reveal REPEAT 2drop r> insRule ! ; -' (initvoc IS 'initvoc - -: addall ( -- ) - voclink - BEGIN @ dup @ WHILE dup (initvoc REPEAT drop ; +' (initvoc) IS 'initvoc \ Hash-Find 01jan93py addall \ Baum aufbauen \ Baumsuche ist installiert. +: hash-cold ( -- ) Defers 'cold + HashPointer off HashTable off HashIndex off + addall ; +' hash-cold IS 'cold + : .words ( -- ) - base @ >r hex context @ 3 cells + HashLen 0 - DO cr i 2 .r ." : " dup @ i cells + + base @ >r hex HashTable @ Hashlen 0 + DO cr i 2 .r ." : " dup i cells + BEGIN @ dup WHILE dup cell+ @ .name REPEAT drop LOOP drop r> base ! ; @@ -78,20 +107,20 @@ addall \ Baum aufbauen \ : square dup * ; \ : countwl ( -- sum sumsq ) -\ \ gives the number of words in the current wordlist and the sum of -\ \ squares for the sublist lengths +\ \ gives the number of words in the current wordlist +\ \ and the sum of squares for the sublist lengths \ 0 0 -\ context @ 3 cells + @ hashlen cells over + swap DO -\ 0 i BEGIN -\ @ dup WHILE -\ swap 1+ swap -\ REPEAT -\ drop -\ swap over square + -\ >r + r> -\ 1 cells -\ +LOOP ; +\ hashtable @ Hashlen cells bounds DO +\ 0 i BEGIN +\ @ dup WHILE +\ swap 1+ swap +\ REPEAT +\ drop +\ swap over square + +\ >r + r> +\ 1 cells +\ +LOOP ; \ : chisq ( -- n ) -\ \ n should have about the same size as hashlen -\ countwl hashlen 2 pick */ swap - ; +\ \ n should have about the same size as Hashlen +\ countwl Hashlen 2 pick */ swap - ;