;;; -*- mode: lisp -*-
;;; $Id: hash.poplisp,v 1.0 2002/05/03 13:28:00 dada Exp $
(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+ "0123456789ABCDEF")
(defconstant +digits-needed+
#( (10 100 1000 10000 100000 10000000 100000000 536870911)
(16 256 4096 65536 1048576 16777216 268435456 4294967296 536870911)
)
)
(defun fixnum-to-string (n base)
(declare (fixnum n base))
(let* ((size (position-if (lambda (x) (> (the fixnum x) n))
(aref +digits-needed+ (ash base -4))))
(result (make-string (1+ size))))
(loop for i fixnum from size downto 0 with q fixnum = n and r fixnum = 0
do (multiple-value-setq (q r) (floor q base))
(setf (schar result i) (aref +digit+ r)))
result)
)
(defun main (&optional (n (command-line-argument)))
(let ((hash (make-hash-table :test 'equal :size n)))
(macrolet ((hash (i base) `(gethash (fixnum-to-string ,i ,base) hash)))
(loop for i fixnum from 1 to n do (setf (hash i 16) i))
(format t "~a~%" (loop for i fixnum from n downto 1 count (hash i 10))))))
(main)