version 1.29, 2002/11/24 19:49:45
|
version 1.39, 2009/12/27 01:00:52
|
Line 1
|
Line 1
|
\ Hashed dictionaries 15jul94py |
\ Hashed dictionaries 15jul94py |
|
|
\ Copyright (C) 1995,1998,2000 Free Software Foundation, Inc. |
\ Copyright (C) 1995,1998,2000,2003,2006,2007 Free Software Foundation, Inc. |
|
|
\ This file is part of Gforth. |
\ This file is part of Gforth. |
|
|
\ Gforth is free software; you can redistribute it and/or |
\ Gforth is free software; you can redistribute it and/or |
\ modify it under the terms of the GNU General Public License |
\ modify it under the terms of the GNU General Public License |
\ as published by the Free Software Foundation; either version 2 |
\ as published by the Free Software Foundation, either version 3 |
\ of the License, or (at your option) any later version. |
\ of the License, or (at your option) any later version. |
|
|
\ This program is distributed in the hope that it will be useful, |
\ This program is distributed in the hope that it will be useful, |
Line 15
|
Line 15
|
\ GNU General Public License for more details. |
\ GNU General Public License for more details. |
|
|
\ You should have received a copy of the GNU General Public License |
\ You should have received a copy of the GNU General Public License |
\ along with this program; if not, write to the Free Software |
\ along with this program. If not, see http://www.gnu.org/licenses/. |
\ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
|
|
[IFUNDEF] erase |
[IFUNDEF] erase |
: erase ( addr len -- ) 0 fill ; |
: erase ( addr len -- ) 0 fill ; |
Line 166 const Create (hashsearch-map)
|
Line 165 const Create (hashsearch-map)
|
[ [IFUNDEF] allocate ] |
[ [IFUNDEF] allocate ] |
ABORT" no more space in hashtable" |
ABORT" no more space in hashtable" |
[ [ELSE] ] |
[ [ELSE] ] |
HashPop @ 1 hashbits lshift >= or |
HashPop @ hashlen 2* >= or |
IF hashdouble THEN |
IF hashdouble THEN |
[ [THEN] ] ; is hash-alloc |
[ [THEN] ] ; is hash-alloc |
|
|
\ Hash-Find 01jan93py |
\ Hash-Find 01jan93py |
has? cross 0= |
has? cross 0= |
[IF] |
[IF] |
|
: hash-wordlist ( wid -- ) |
|
hashsearch-map swap wordlist-map ! ; |
: make-hash |
: make-hash |
hashsearch-map forth-wordlist wordlist-map ! |
forth-wordlist hash-wordlist |
|
environment-wordlist hash-wordlist |
|
['] Root >body hash-wordlist |
addall ; |
addall ; |
make-hash \ Baumsuche ist installiert. |
make-hash \ Baumsuche ist installiert. |
[ELSE] |
[ELSE] |
Line 193 has? cross 0=
|
Line 196 has? cross 0=
|
\ REPEAT drop |
\ REPEAT drop |
[ has? ec [IF] ] ." Done" cr [ [THEN] ] ; |
[ has? ec [IF] ] ." Done" cr [ [THEN] ] ; |
|
|
' hash-cold INIT8 chained |
:noname ( -- ) |
|
defers 'cold |
|
hash-cold |
|
; is 'cold |
|
|
: .words ( -- ) |
: .words ( -- ) |
base @ >r hex HashTable Hashlen 0 |
base @ >r hex HashTable Hashlen 0 |
Line 223 has? cross 0=
|
Line 229 has? cross 0=
|
\ : chisq ( -- n ) |
\ : chisq ( -- n ) |
\ \ n should have about the same size as Hashlen |
\ \ n should have about the same size as Hashlen |
\ countwl Hashlen 2 pick */ swap - ; |
\ countwl Hashlen 2 pick */ swap - ; |
|
|
|
\ Create hashhist here $100 cells dup allot erase |
|
|
|
\ : .hashhist ( -- ) hashhist $100 cells erase |
|
\ HashTable HashLen cells bounds |
|
\ DO 0 I BEGIN @ dup WHILE swap 1+ swap REPEAT drop |
|
\ 1 swap cells hashhist + +! |
|
\ cell +LOOP |
|
\ 0 0 $100 0 DO |
|
\ hashhist I cells + @ dup IF |
|
\ cr I 0 .r ." : " dup . THEN tuck I * + >r + r> |
|
\ LOOP cr ." Total: " 0 .r ." /" . cr ; |