Re: creating fresh objects of type 'self

From: Markus Mottl (
Date: Mon Apr 12 1999 - 14:03:54 MET DST

From: Markus Mottl <>
Message-Id: <>
Subject: Re: creating fresh objects of type 'self
Date: Mon, 12 Apr 1999 13:03:54 +0100 (MET DST)
In-Reply-To: <> from "Didier Remy" at Apr 12, 99 10:33:28 am

> > But I wonder, how I can do something similar to get a "fresh" object.
> The method clone already gives you a fresh copy of the original object. So
> why aren't you happy with the method clone?

My initial idea was the following:

A parent object that has a list of child objects of the same type and
a method that adds a "fresh" (not a copy!) of the initial object (= as
the parent was created) to this list.

This following example does not work, of course, because "parent" is
not necessarily of type "'self".

  class parent = object (self : 'self)
    val mutable children : 'self list = []
    method add_fresh_object = children <- new parent :: children

This works, of course:

  class parent = object (self : 'self)
    val mutable children : 'self list = []
    method add_fresh_object = children <- {<>} :: children

But this is not the intended result: now we have added a *copy* of
the current object, not of its "fresh" state, i.e. the state it was in
immediately after creation.

At first I thought this could be solved with something like "new 'self",
but didn't think about the problem of what to do with objects that are
created with parameters: the existence of a function like "new 'self"
would then require that a reference to the parameters is kept for every
object so that it can be "freshly" created at anytime.
But the meaning of "new 'self" could be ambiguous if the parameters can
be changed with side-effects. Making copies of the initial parameters
to circumvent this problem is probably also not a good idea - this could
take up tons of memory.
Thus, I fear that a feature like "new 'self" is not one you might want
to add...

I have "solved" my problem now by using a closed object type for the
elements of the list "children". If I want to add an object, which is
of another type (maybe it's further down the inheritance hierarchie),
I just coerce (if possible) the object in question to this closed object
type. This solution is, unfortunately, not so flexible and elegant.

I hope my new problem description is a bit clearer than my last one...

Best regards,
Markus Mottl

Markus Mottl,,

This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:22 MET