From: Claudio Sacerdoti Coen <sacerdot@cs.unibo.it>
To: caml-list@yquem.inria.fr
Subject: Re: [Caml-list] Avoiding shared data
Date: Mon, 26 Sep 2005 09:57:17 +0200 [thread overview]
Message-ID: <20050926075716.GA30835@cs.unibo.it> (raw)
In-Reply-To: <20050925213202.32862.qmail@web26805.mail.ukl.yahoo.com>
> It would be great to know of a completely general (any
> nested structures) and fast solution (without copying)
> how to produce unshared data structures.
If you like to play with fire you can use this unsharing function
(that is not complete with respect to any data type, but it is sufficient
for my needs). Since it works on the run-time representation of data,
it can even unshare abstract data types.
exception CanNotUnshare;;
(* [unshare t] gives back a copy of t where all sharing has been removed *)
(* Physical equality becomes meaningful on unshared terms. Hashtables that *)
(* use physical equality can now be used to associate information to evey *)
(* node of the term. *)
val unshare: ?already_unshared:('a -> bool) -> 'a -> 'a
let unshare ?(already_unshared = function _ -> false) t =
let obj = Obj.repr t in
let rec aux obj =
if already_unshared (Obj.obj obj) then
obj
else
(if Obj.is_int obj then
obj
else if Obj.is_block obj then
begin
let tag = Obj.tag obj in
if tag < Obj.no_scan_tag then
begin
let size = Obj.size obj in
let new_obj = Obj.new_block 0 size in
Obj.set_tag new_obj tag ;
for i = 0 to size - 1 do
Obj.set_field new_obj i (aux (Obj.field obj i))
done ;
new_obj
end
else if tag = Obj.string_tag then
obj
else
raise CanNotUnshare
end
else
raise CanNotUnshare
)
in
Obj.obj (aux obj)
;;
--
----------------------------------------------------------------
Real name: Claudio Sacerdoti Coen
Doctor in Computer Science, University of Bologna
E-mail: sacerdot@cs.unibo.it
http://www.cs.unibo.it/~sacerdot
----------------------------------------------------------------
next prev parent reply other threads:[~2005-09-26 8:01 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-25 21:32 Martin Chabr
2005-09-26 0:23 ` [Caml-list] " Bill Wood
2005-09-26 7:57 ` Claudio Sacerdoti Coen [this message]
2005-09-26 8:17 ` William Lovas
2005-09-26 21:07 ` Ant: " Martin Chabr
2005-09-26 22:08 ` Jon Harrop
2005-09-30 22:57 ` Oliver Bandel
2005-10-01 0:07 ` Pal-Kristian Engstad
2005-10-01 5:46 ` Bill Wood
2005-10-01 8:27 ` Wolfgang Lux
2005-10-01 18:02 ` Wolfgang Lux
2005-10-01 21:50 ` Ant: " Martin Chabr
2005-10-01 12:34 ` Oliver Bandel
2005-10-01 13:58 ` Bill Wood
2005-10-01 21:05 ` Ant: " Martin Chabr
2005-10-03 0:41 ` skaller
2005-10-03 1:13 ` Seth J. Fogarty
2005-10-03 13:09 ` Thomas Fischbacher
2005-10-03 14:57 ` skaller
2005-10-03 20:03 ` Ant: " Martin Chabr
2005-10-03 20:25 ` Thomas Fischbacher
2005-10-03 21:08 ` Jon Harrop
2005-10-04 18:06 ` Ant: " Martin Chabr
2005-10-04 18:32 ` Jon Harrop
2005-10-04 2:53 ` skaller
2005-10-04 16:15 ` Brian Hurt
2005-10-04 16:47 ` FP/IP and performance (in general) and Patterns... (Re: [Caml-list] Avoiding shared data) Oliver Bandel
2005-10-04 22:38 ` Michael Wohlwend
2005-10-05 0:31 ` Jon Harrop
2005-10-04 22:39 ` Christopher A. Watford
2005-10-04 23:14 ` Jon Harrop
2005-10-05 12:10 ` Oliver Bandel
2005-10-05 13:08 ` Jon Harrop
2005-10-05 15:28 ` skaller
2005-10-05 20:52 ` Ant: " Martin Chabr
2005-10-05 23:21 ` Markus Mottl
2005-10-06 16:54 ` brogoff
2005-10-05 0:45 ` Brian Hurt
2005-10-04 18:09 ` Ant: Re: Ant: Re: Ant: Re: Ant: Re: [Caml-list] Avoiding shared data Martin Chabr
2005-10-05 8:42 ` skaller
2005-10-05 11:14 ` Andrej Bauer
2005-10-01 21:36 ` Ant: Re: Ant: " Martin Chabr
2005-10-03 11:51 ` getting used to FP-programming (Re: Ant: Re: Ant: Re: [Caml-list] Avoiding shared data) Oliver Bandel
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=20050926075716.GA30835@cs.unibo.it \
--to=sacerdot@cs.unibo.it \
--cc=caml-list@yquem.inria.fr \
/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).