\ -*- mode: forth -*-
\ $Id: hash2.gforth,v 1.1 2001/05/25 21:32:46 doug Exp $
\ http://www.bagley.org/~doug/shootout/
\ from Anton Ertl:


0. argc @ 1- arg >number 2drop drop constant NUM

wordlist constant hash1
wordlist constant hash2

: build 
    get-current hash1 set-current
    10000 0 ?do
    i 0 <# #s '_ hold 'o hold 'o hold 'f hold #> nextname i constant
    loop
    set-current ;

: search-new 
    >r 2dup r@ search-wordlist if
    rdrop nip nip
    else
    nextname get-current r> set-current 0 constant set-current
    lastxt
    endif ;

: add-to-hash2 
    dup name>int execute 
    swap name>string hash2 search-new >body +! ;

: build2 
    hash1 wordlist-id begin
    @ dup
    while
    dup add-to-hash2
    repeat
    drop ;

: countdecs 
    NUM 0 ?do
    build2
    loop ;

build countdecs

hash1 >order
foo_1 .
foo_9999 .
previous

hash2 >order
foo_1 .
foo_9999 0 .r cr
previous bye