;;; -*- mode: lisp -*- ;;; $Id: hash2.cmucl,v 1.4 2001/06/26 03:19:55 doug Exp $ ;;; http://www.bagley.org/~doug/shootout/ ;;; from Paul Foley (declaim (optimize (speed 3) (space 0) (safety 0) (debug 0) (compilation-speed 0))) (defun command-line-argument () (parse-integer (or (car pop11::poparglist) "1"))) (defconstant +digit+ "0123456789") (defconstant +digits-needed+ '(10 100 1000 10000 100000 10000000 100000000 536870911)) (defun fixnum-to-foo-string (n) (declare (fixnum n)) (let* ((size (+ 4 (position-if (lambda (x) (> (the fixnum x) n)) +digits-needed+))) (result (make-string (1+ size)))) (replace result "foo_") (loop for i fixnum from size downto 4 with q fixnum = n and r fixnum = 0 do (multiple-value-setq (q r) (floor q 10)) (setf (schar result i) (aref +digit+ r))) result)) (defun main (&optional (n (command-line-argument))) (let ((hash1 (make-hash-table :test 'equal :size n)) (hash2 (make-hash-table :test 'equal :size n))) (macrolet ((hash1 (i) `(gethash (fixnum-to-foo-string ,i) hash1)) (hash2 (i) `(gethash (fixnum-to-foo-string ,i) hash2))) (loop for i fixnum below 10000 do (setf (hash1 i) i)) (loop for i fixnum below n do (maphash (lambda (k v) (declare (fixnum v)) (incf (the fixnum (gethash k hash2 0)) v)) hash1)) (format t "~D ~D ~D ~D~%" (hash1 1) (hash1 9999) (hash2 1) (hash2 9999))))) (main)