Screen 0 not modified 0 \ HashCash Suchalgorithmus UH 11Nov86 1 2 Ein Algorithmus, der die Dictionarysuche beschleunigt: 3 Zuerst wird uebr das gesucht Wort gehasht und in in einer 4 Tabelle nachgesehen. Schlaegt der Versuch fehl, wird ganz normal 5 gesucht. Suchzeit geht auf ca. 70-80% gegenueber normalem Suchen 6 herunter. 7 8 Hinzu kommen die Worte: 9 cash, hash-thread, erase-cash, 'cash, und found? 10 11 Im Kernal neudefiniert oder gepatched werden muessen: 12 (find, hide, reveal, forget-words 13 14 (find und (forget benutzen jejweils die alten Worte. Sie muessen 15 umbenannt oder in die neuen Worte eingebettet werden. Screen 1 not modified 0 \ Hash Cash fuer volksFORTH UH 11Nov86 1 2 Create cash $200 allot 3 4 ' Forth >body Constant hash-thread 5 : erase-cash ( -- ) cash $200 erase ; erase-cash 6 7 1 3 +thru 8 9 patch (find 10 ( patch forget-words ) ' forget-words \ forget-words 11 dup ' clear >body 6 + ! \ liegt auf einer ungluecklichen 12 dup ' (forget >body $12 + ! \ Adresse, sodass das automa- 13 dup ' empty >body 8 + ! \ tische Patchen nicht klappt. 14 ' save >body 4+ ! 15 patch hide patch reveal forget (patch save Screen 2 not modified 0 \ 'cash found? hfind UH 23Oct86 1 2 : 'cash ( nfa -- 'cash ) 3 count $1F and under bounds 4 ?DO I c@ + LOOP $FF and 2* cash + ; 5 6 : found? ( str nfa -- f ) 7 count rot count rot over = IF swap -text 0= exit THEN 8 drop 2drop false ; 9 10 : (find ( str thread -- str false | nfa true ) 11 dup hash-thread - IF (find exit THEN 12 drop dup 'cash @ 2dup found? IF nip true exit THEN 13 drop hash-thread (find dup 0= ?exit over dup 'cash ! ; 14 15 Screen 3 not modified 0 \ Kernal changes UH 23Oct86 1 2 ' hide >body @ | Alias last? 3 4 : hide last? IF 0 over 'cash ! 2- @ current @ ! THEN ; 5 6 : reveal last? IF dup dup 'cash ! 2- current @ ! THEN ; 7 8 ' clear >body 6 + @ | Alias forget-words 9 10 | : forget-words erase-cash forget-words ; 11 12 : .cash cash $200 bounds DO I @ ?dup IF .name THEN 2 +LOOP ; 13 14 15 Screen 4 not modified 0 \ patching UH 23Oct86 1 2 : (patch ( new old -- ) 3 ['] cash 0 DO 4 i @ over = IF cr I u. over I ! THEN LOOP 2drop ; 5 6 : patch \ name 7 >in @ ' swap >in ! dup >name 2- context push context ! ' 8 (patch ; 9 10 11 12 13 14 15