caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Nate Nystrom <nystrom@cs.cornell.edu>
To: caml-list@yquem.inria.fr
Cc: Andrew Myers <andru@cs.cornell.edu>
Subject: Re: [Caml-list] Possibility of Nested Classes and Nested Inheritance?
Date: Fri, 24 Dec 2004 14:48:41 -0500	[thread overview]
Message-ID: <CFEDD357-55E4-11D9-9B74-000A958B604C@cs.cornell.edu> (raw)
In-Reply-To: <20041217184433.GA1036@balm.cs.cornell.edu>

From: Jacques Garrigue <garrigue@math.nagoya-u.ac.jp>
> From: "Jørgen Hermanrud Fjeld" <jhf@hex.no>
>
>> I just read about the work by Nystrom, Chong and Myers on nested
>> inheritance, specifically the article "Scalable Extensibility via 
>> Nested Inheritance".
>>
>> The article does demonstrate fascinating, to me, use of inheritance, 
>> and I wonder if it is possible to do something similar and
>> object-oriented in OCaml.
>>
>> To do something similar would, according to my understanding, require
>> both inner classes and super-class polymorphism.
>> In understand inner classes as implicitly polymorphic with respect
>> to the enclosing class,
>> and polymorphism on the super class as the practical ability to extend
>> the type hierarchy upwards.
>>
>> Do you know of any work that relate nested inheritance to OCaml, or 
>> that
>> address the similar issuesof inner classes and super-class 
>> polymorphism?
>
> Answer 1: there are no inner classes in ocaml.

Another alternative is to use nested inheritance with modules.  This
likely requires that module inheritance be added to the language,
although there may be other approaches that fit in better with the ocaml
module system.  In fact, we expect that in Jx (our extension of Java 
with nested inheritance) package inheritance will be the main use of
nested inheritance.

> Answer 2: there are plenty of other ways to obtain similar effects.
>
> I don't know exactly what fascinated you in the paper, so it is hard
> to answer precisely, but there are already a few techniques in ocaml to
> solve the problems they describe.
> (Of course they wouldn't cite them, as ocaml doesn't look like a
> relevant language to them.)

I admit I was unaware of polymorphic variants.  I certainly would
have cited ocaml had I been aware of them.

>
> Their compiler example seems to be a variant of the expression
> problem.

The expression problem is an instance of what we call scalable
extensibility.

> There are several solutions to the expression problem in ocaml, using
> either polymorphic variants
>   http://wwwfun.kurims.kyoto-u.ac.jp/~garrigue/papers/fose2000.html

I don't see how polymorphic variants solve the expression problem.
As I understand them, if I were to implement a compiler using 
polymorphic variants, I would create a variant for each term
in the language, then write functions that match against those
variants to implement the compiler passes.

However, if I want to add a new term to the language, I would
have to add a new variant, then write new functions for each of
the compiler passes to handle the new variant, delegating to the
old functions for the old variants.  Thus if I have n passes
implemented as functions, I have to write O(n) code to add a
new term.  Please correct me if I'm wrong on this.
Zenger and Odersky's ICFP'00 paper on extensible algebraic
datatypes with defaults addresses this particular problem.

Furthermore, to allow extension, recursion is left open for
the functions implementing the compiler passes and then closed
in order to invoke the function on a particular type.  Thus, when a new 
variant is added, a small amount of code for each open recursive
function needs to be written to close the recursion with the new type.

> or objects
>   http://pauillac.inria.fr/~remy/work/expr/
>
> On the more general question of virtual types, Didier Rémy and Jérôme
> Vouillon gave a detailed "refutation".
>   http://pauillac.inria.fr/~remy/work/virtual/

This paper shows that you can use parametric polymorphism to solve the
same problems virtual types were designed to address.  The problem to
look out for with this approach is that you may end up parameterizing a
class on a large number of related classes, e.g., parameterizing
a compiler pass class on every AST node class (in our Java compiler,
there are 40-50 such classes).  This paper argues that, in practice, you
won't have too many parameters because you only need to parameterize on
types on which there is actually a constraint.  I think this does not
work with our compiler problem.  Using the traditional visitor pattern,
you will have to parameterize the visitor class on every AST node class.

> So you can see if you can do all what you need with the above methods.
> If you find some unexpected limitation, please let us now.
>
> Jacques Garrigue

Nate


       reply	other threads:[~2004-12-24 19:48 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20041217184433.GA1036@balm.cs.cornell.edu>
2004-12-24 19:48 ` Nate Nystrom [this message]
2004-12-25  0:26   ` skaller
2004-12-25 10:59   ` Jacques Garrigue
2004-12-27  2:24   ` Jacques Garrigue
2004-12-16 14:59 Jørgen Hermanrud Fjeld
2004-12-16 21:50 ` [Caml-list] " John Prevost
2004-12-17  1:31 ` Jacques Garrigue

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=CFEDD357-55E4-11D9-9B74-000A958B604C@cs.cornell.edu \
    --to=nystrom@cs.cornell.edu \
    --cc=andru@cs.cornell.edu \
    --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).