You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Original bug ID: 1179 Reporter: administrator Status: closed (set by @xavierleroy on 2013-08-31T10:46:04Z) Resolution: won't fix Priority: normal Severity: feature Category: ~DO NOT USE (was: OCaml general)
Bug description
Bonjour,
la fonction générique Hashtbl.hash est bien pratique sur des structures
imbriquées (avec termes, listes, records, tableaux, ...). Le problème,
c'est que dès que l'une des informations aux "feuilles" n'est plus
hashable (par exemple parce que l'on manipule des structures récursives,
ou que l'on veut fournir sa propre fonction de hash pour un bloc Caml), on
ne peut plus du tout l'utiliser (donc bye bye par exemple la version non
fonctorielle de Hashtbl) et il faut dérouler des lignes de code:
c'est pénible et on perd en performance.
Ce serait bien de pouvoir implémenter un module M de signature:
type 'a t
val lift: int -> 'a -> 'a t
val value: 'a t -> 'a
tel que:
Hashtbl.hash (M.lift n x) = n
M.value (M.lift x) = x
Je vois deux methodes assez simples qui permettrait de faire ça:
introduire un nouveau tag de bloc Fixedhash_tag et faire que la
fonction hash ne regarde que le premier objet de ces blocs
sans nouveau tag: allouer un bloc global "sentinelle" bidon, de taille
1, et sortir de la boucle:
while (i != 0) {
i--;
hash_aux(Field(obj, i));
}
(dans byterun/hash.c) dès que l'on tombe dessus
Le 2) est très peu intrusif, ne devrait pas être trop pénalisant dans le
cas général, et permettrait au programmeur d'écrire des choses comme:
type t = { ... ; sentinel : Sentinel.t ; ... }
pour séparer ce qui est hashable de ce qui ne l'est pas.
Bon, c'est de la cuisine, mais je trouve que ça serait vraiment très
pratique (et léger à implémenter).
-- Alain
The text was updated successfully, but these errors were encountered:
Original bug ID: 1179
Reporter: administrator
Status: closed (set by @xavierleroy on 2013-08-31T10:46:04Z)
Resolution: won't fix
Priority: normal
Severity: feature
Category: ~DO NOT USE (was: OCaml general)
Bug description
Bonjour,
la fonction générique Hashtbl.hash est bien pratique sur des structures
imbriquées (avec termes, listes, records, tableaux, ...). Le problème,
c'est que dès que l'une des informations aux "feuilles" n'est plus
hashable (par exemple parce que l'on manipule des structures récursives,
ou que l'on veut fournir sa propre fonction de hash pour un bloc Caml), on
ne peut plus du tout l'utiliser (donc bye bye par exemple la version non
fonctorielle de Hashtbl) et il faut dérouler des lignes de code:
c'est pénible et on perd en performance.
Ce serait bien de pouvoir implémenter un module M de signature:
type 'a t
val lift: int -> 'a -> 'a t
val value: 'a t -> 'a
tel que:
Hashtbl.hash (M.lift n x) = n
M.value (M.lift x) = x
Je vois deux methodes assez simples qui permettrait de faire ça:
fonction hash ne regarde que le premier objet de ces blocs
1, et sortir de la boucle:
while (i != 0) {
i--;
hash_aux(Field(obj, i));
}
(dans byterun/hash.c) dès que l'on tombe dessus
Le 2) est très peu intrusif, ne devrait pas être trop pénalisant dans le
cas général, et permettrait au programmeur d'écrire des choses comme:
type t = { ... ; sentinel : Sentinel.t ; ... }
pour séparer ce qui est hashable de ce qui ne l'est pas.
Bon, c'est de la cuisine, mais je trouve que ça serait vraiment très
pratique (et léger à implémenter).
-- Alain
The text was updated successfully, but these errors were encountered: