(* -*- mode: sml -*- * $Id: hash2.smlnj,v 1.3 2001/07/10 13:01:54 doug Exp $ * http://www.bagley.org/~doug/shootout/ * Modified by Daniel Wang *) structure Test : sig val main : (string * string list) -> OS.Process.status end = struct open HashTable; fun hashtest2 n = let exception NotFound val h1 = mkTable (HashString.hashString, op =) (10000, NotFound) val h2 = mkTable (HashString.hashString, op =) (10000, NotFound) fun doinserts1 i = if i < 10000 then ( insert h1 ("foo_" ^ (Int.toString i), i); doinserts1 (i+1) ) else () fun addinto h k v1 = case find h k of SOME valref => valref := (!valref) + v1 | NONE => insert h (k, ref v1) fun doinserts2 i = if i < n then ( appi (fn (k,v) => (addinto h2 k v)) h1; doinserts2 (i+1) ) else () in ( doinserts1 0; doinserts2 0; print (Int.toString (lookup h1 "foo_1")); print " "; print (Int.toString (lookup h1 "foo_9999")); print " "; print (Int.toString (!(lookup h2 "foo_1"))); print " "; print (Int.toString (!(lookup h2 "foo_9999"))); print "\n" ) end; fun atoi s = case Int.fromString s of SOME num => num | NONE => 0; fun main(name, args) = let val arg = hd(args @ ["1"]) val num = atoi arg in hashtest2 num; OS.Process.success end end val _ = SMLofNJ.exportFn("hash2", Test.main);