caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Pierre Chambart <pierre.chambart@ocamlpro.com>
To: Alain Frisch <alain.frisch@lexifi.com>,
	"Soegtrop, Michael" <michael.soegtrop@intel.com>,
	"caml-list@inria.fr" <caml-list@inria.fr>
Subject: Re: [Caml-list] Specify the default hash function for a type
Date: Fri, 13 May 2016 15:50:49 +0200	[thread overview]
Message-ID: <5735DBB9.5050101@ocamlpro.com> (raw)
In-Reply-To: <850765ff-25f1-ecb9-9707-74d3dc47675c@lexifi.com>

For those who don't see that as a joke, please forget everything about that.
Obj.set_tag is an extremely dangerous function as the compiler assumes that
value's tag never change, even for completely unknown values. Hence, it
might
be legal for the compiler to do something that you might not expect on:

let f x =
  let x' = Obj.repr x in
  let tag = Obj.tag x' in
  Obj.set_tag x' 0
  let ... = match x with ... in
  Obj.set_tag x' tag;
  match x with ...

The access to the tag can be shared for instance. And lots of
'surprising' stuff might happen.
This is of course a quite brutal example but this could apply to a lot
of less obvious situation !

So Obj.magic and Obj.set_field : bad
Obj.set_tag: really really bad !
-- 
Pierre

On 13/05/2016 11:06, Alain Frisch wrote:
> Dear Michael,
>
> Don't tell anybody (ahem), but the following might work depending on
> your exact use case...
>
> If you define a type such as:
>
>  type t = {
>    foo: ....;
>    id: int;
>  }
>
> and if you set the tag of values for this type to Obj.record_tag (=
> 248) with Obj.set_tag, then polymorphic hash *and* comparison
> functions will use the "id" field and ignore the "foo" field (and any
> other extra fields).  It is important to keep "id" as the second field
> to mimic the layout of real object values (and exception slots).
>
> In particular, this lets you easily "forget" sub-parts of a value (by
> setting "id" to a fixed constant), or implement "references compared
> with physical equality" (use a counter to assign unique "id" to each
> such reference).
>
>
> Best regards,
>
> Alain
>
>
>
> On 13/05/2016 09:52, Soegtrop, Michael wrote:
>> Dear Ocaml Users,
>>
>>
>>
>> I wonder if there is a way to specify a default hash function for a
>> type, which is then used by the automated hash functions e.g. created
>> for records containing this type. I have e.g. a record with about 10
>> fields and I am happy with the default hash functions for most fields
>> and for the record, but for just one field I would like to use a custom
>> hash function, but I don’t want to write a hash function for the record.
>>
>>
>>
>> I am currently using the standard library, but if there is a solution
>> with Batteries or Core, I would also be interested.
>>
>>
>>
>> Best regards,
>>
>>
>>
>> Michael
>>
>> Intel Deutschland GmbH
>> Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
>> Tel: +49 89 99 8853-0, www.intel.de
>> Managing Directors: Christin Eisenschmid, Christian Lamprechter
>> Chairperson of the Supervisory Board: Nicole Lau
>> Registered Office: Munich
>> Commercial Register: Amtsgericht Muenchen HRB 186928
>>
>



  parent reply	other threads:[~2016-05-13 13:50 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-13  7:52 Soegtrop, Michael
2016-05-13  8:13 ` Ben Millwood
2016-05-13  8:40   ` Soegtrop, Michael
2016-05-13  9:06 ` Alain Frisch
2016-05-13  9:26   ` Soegtrop, Michael
2016-05-13 12:01     ` Gabriel Scherer
2016-05-13 12:23       ` Alain Frisch
2016-05-13 12:32       ` Soegtrop, Michael
2016-05-13 13:50   ` Pierre Chambart [this message]
2016-05-13 13:56     ` Alain Frisch
2016-05-13 16:17       ` Soegtrop, Michael
2016-05-13 18:57         ` Thomas Braibant
2016-05-13 22:45           ` Soegtrop, Michael
2016-05-14  8:41             ` Thomas Braibant
2016-05-14  9:06               ` Soegtrop, Michael
2016-05-17 13:03                 ` Soegtrop, Michael

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5735DBB9.5050101@ocamlpro.com \
    --to=pierre.chambart@ocamlpro.com \
    --cc=alain.frisch@lexifi.com \
    --cc=caml-list@inria.fr \
    --cc=michael.soegtrop@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).