[r6rs-discuss] [Formal] re: hash-table-hash-function should return
a function
Daniel Villeneuve
daniel_villeneuve at sympatico.ca
Sat Feb 17 17:57:23 EST 2007
---
This message is a formal comment which was submitted to formal-comment at r6rs.org, following the requirements described at: http://www.r6rs.org/process.html
---
Sorry, the header of the previous mail was messed up (surely
my typing M-q).
submitter's name: Daniel Villeneuve
submitter's email address: daniel_villeneuve at sympatico.ca
type of issue: enhancement
priority: minor
R6RS component: Hash Tables
version of the report: 5.92
SUMMARY
The specification of hash-table-hash-function should not
force implementations to return #f when something more
useful is available.
DESCRIPTION
Quoting from
http://www.r6rs.org/r6rs-editors/2006-March/001047.html, one
can see that there were some arguments about the behavior of
hash-table-hash-function for hash tables built from
make-eq-hash-table and make-eqv-hash-table:
<quote> >>Procedure: hash-table-hash-function hash-table =>
procedure
>>
>> Returns the hash function used by hash-table.
>
>
> Should these procedures be defined on hash tables that
> were created by calling make-eq-hash-table or
> make-eqv-hash-table?
You're right that hash-table-hash-function shouldn't be, so
I've added provisional language to that effect. </quote>
The current wording on page 52 requires that
hash-table-hash-function return #f for such tables.
I find some problems with this: a) This situation prevents
implementations that can return useful functions to do so.
b) This inhibits having a complete "hash-table-clone"
method, which I think is one of the most useful usages for
such inspection methods: (define (hash-table-clone ht k)
(make-hash-table (hash-table-hash-function ht)
(hash-table-equivalence-function ht) k)) c) On systems that
provide users with public hash-eq and hash-eqv functions,
the current wording forces the implementation to remember if
a hash table was built using (make-eq-hash-table) or
(make-hash-table hash-eq eq?), just for the sake of
complying with the hash-table-hash-function's spec.
PROPOSAL
Alternative 1: on hash tables built using make-eq-hash-table
and make-eqv-hash-table, hash-table-hash-function can return
the implementation's choice of hash-function if this is
available, or #f otherwise.
This addresses issues a) and c), but not b).
Alternative 2: hash-table-hash-function should always return
a function, suitable to be used as a hash function by
make-hash-table. For tables built using make-eq-hash-table
and make-eqv-hash-table, the returned function can throw an
exception if invoked.
This addresses issues a), b) and c).
--
Daniel Villeneuve
More information about the r6rs-discuss
mailing list