[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: error in hash table reference implementation

This page is part of the web mail archives of SRFI 69 from before July 7th, 2015. The new archives for SRFI 69 contain all messages, not just those from before July 7th, 2015.



On Tue, Aug 09, 2005 at 09:13:41PM -0400, Jonathan Kraut wrote:
> But before you do, I found an error in the reference implementation:
> (alist->hash-table '((a . b) (c . d)))
> calls make-hash-table with incorrect arguments:
> (make-hash-table #f #f 64),
> which succeeds but is wrong.

This is similar to Per's notice about (make-hash-table) not using
hash-by-identity; it's a sign of (my) bad coding style that
implementation details of some functions -- like hash-by-identity,
make-hash-table -- are exposed in other functions -- like
make-hash-table and alist->hash-table, respectively.

Again, it is only a problem for implementors that make partial use of
the SRFI implementation.  I could fix them, but I also think that hash
tables are of such a central nature that implementors should provide
native support for them.  The SRFI code is not the greatest,
most-optimised, neatest code ever; it just shows one way to implement
the requirements of the SRFI.

> Here is a fixed version:
> (define (alist->hash-table alist . args)
>   (let ((hash-table
>           (make-hash-table
>             (if (not (null? args))
>                 (car args)
>                 equal?)
>             (if (and (not (null? args)) (not (null? (cdr args))))
>                 (cadr args)
>                 hash)
>             (if (and (not (null? args)) (not (null? (cdr args)))
>                      (not (null? (cddr args))))
>                 (caddr args)
>                 (max *default-table-size* (* 2 (length alist)))))))
>     (for-each (lambda (elem)
>                 (hash-table-set! hash-table (car elem) (cdr elem)))
>               alist)
>     hash-table))

This does not account for the special case of string-ci=?.  To really
fix this, we should extract the hash function deduction logic into a
separate function.  I can do that if there are some seconds to declare
this important enough.

Panu

-- 
personal contact: atehwa@xxxxxx, +35841 5323835, +3589 85619369
work contact: panu.kalliokoski@xxxxxxxxxxx, +35850 3678003
kotisivu (henkkoht):	http://www.iki.fi/atehwa/
homepage (technical):	http://sange.fi/~atehwa/