caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
To: checker@d6.com
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] anonymous record copy?
Date: Thu, 28 Jun 2001 12:42:43 +0900	[thread overview]
Message-ID: <20010628124243M.garrigue@kurims.kyoto-u.ac.jp> (raw)
In-Reply-To: <200106280248.TAA15050@smtp2-cm.mail.eni.net>

> How do you copy a record without a) updating anything in the record,
> and b) not knowing the type of the record?
> 
> type foo = { mutable bar : int }
> 
> let a = { bar = 12 }
> 
> let copy_record = ???  
> 
> (* hopefully copy_record is 'a -> 'a, not foo -> foo *)
> 
> let b = copy_record a
> 
> b.bar <- 234  (* should not modify a.bar *)

The problem is that if the type were 'a -> 'a, it would not apply only
on records, but on just anything. Constrast this with Obj.copy, which
applies on any object, but only on objects.

I believe the natural way to write the copy of a record is
{x with bar = x.bar}. You need to have at least one field, in order to
know the actual type of the record, which gives you the list of fields
to copy.

Another way would be to use the Obj module, which is implementation
dependent. The block must be marked either by a constructor tag or
double_array_tag, otherwise you can break everything. In particulars
objects have an oid, and should not be copied this way.

let copy_record (r : 'a) : 'a =
  let obj = Obj.repr r in
  if Obj.is_int obj || Obj.size obj = 0 then r else
  let tag = Obj.tag obj in
  if tag < Obj.object_tag || tag = Obj.double_array_tag then
    Obj.obj (Obj.dup obj)
  else invalid_arg "copy_record"

Cheers,

Jacques Garrigue
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs  FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr  Archives: http://caml.inria.fr


      reply	other threads:[~2001-06-28  3:42 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-06-28  2:48 Chris Hecker
2001-06-28  3:42 ` Jacques Garrigue [this message]

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=20010628124243M.garrigue@kurims.kyoto-u.ac.jp \
    --to=garrigue@kurims.kyoto-u.ac.jp \
    --cc=caml-list@inria.fr \
    --cc=checker@d6.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).