caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
To: oleg_inconnu@myrealbox.com
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Five Questions about Objects
Date: Sun, 14 Jul 2002 12:26:00 +0900	[thread overview]
Message-ID: <20020714122600U.garrigue@kurims.kyoto-u.ac.jp> (raw)
In-Reply-To: <200207131340.JAA07158@hickory.cc.columbia.edu>

From: Oleg <oleg_inconnu@myrealbox.com>
> A few questions on objects:
> 
> 1) Why does the following code define a polymorphic class
> 
>  class point a b = 
>     object 
>       val x = a
>       val y = b
>     end;;

It is not a "polymorphic class", but a class containing polymorphic
variables. You have no way to access them from outside the class.

> but adding "method get () = (x, y)" results in type errors only
> resolvable by  specifying types with "class ['a, 'b] point (a:'a)
> (b:'b)" ? Why doesn't
> 
>  class point a b = 
>     object 
>       val x = a
>       val y = b
>       method get () = (x, y)
>     end;;
> 
> give me a polymorphic class?

A class definition defines four things
* a class value, to build objects and inherit from
* a class type, to use in interfaces
* an object type, to abbreviate the < m1: t1; ...; mn: tn > notation
* an object subtype #c, to abbreviate < m1: t1; ...; mn: tn; .. >

The above would be ok for the class value alone, but in order to
define the class and object types, you need to make explicit the type
parameters. This is the goal of the class ['a] c ... notation.
Otherwise you might end up with type definition different from what
you were expecting (two many type variables, different parameter order...)

I sometimes wonder if it would not be possible to allow defining the
class alone, without defining types, but this might be more confusing
than useful.

> 2) What is the point of "class" and "new" keywords? How are they better than 
> "let" ? E.g.
> 
> let point a b = 
>   object
>     val x = a
>     val y = b
>     method get () = (x, y)
>   end;;

See the above explanation. A class definition does not define only a value.

> let my_point = point 3 7;; 

No very deep reason for new, yet there are some semantic differences.
For instance, if your class takes no arguments but contains mutable
fields, each call to new creates a fresh object.
That is,
     let c = new c in c, c
is not equivalent to
     new c, new c

> 3) Is it possible to access object datafields directly or only through 
> methods?

Only through methods.
Otherwise variables should appear in the object type.

> 4) Can I construct an object that the following function f would accept?
> # let f a = a#m1 (); a#b#m2 ();;
> val f : < b : < m2 : unit -> 'a; .. >; m1 : unit -> 'b; .. > -> 'a = <fun>

Yoriyuki Yamagata already answered.

The LablGTK is full of such methods calls.

> 5) What is the current state of marshalling objects? Is Jacques's
> patch going  to be used in the upcoming O'Caml version or is it too
> untested?

Not in the upcoming version, but maybe in the next.
The semantics are a bit tricky, and we don't want to put possibly
wrong code in the official distribution.
A known issue is the interaction with dynamic loading. In most cases
it should be ok, but one can imagine bad scenarii.

Jacques Garrigue
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


  parent reply	other threads:[~2002-07-14  3:32 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-07-13 13:42 Oleg
2002-07-14  0:58 ` YAMAGATA yoriyuki
2002-07-14  2:41   ` Brian Smith
2002-07-20 15:46     ` YAMAGATA yoriyuki
2002-07-14  8:58   ` Alain Frisch
2002-07-14  9:38     ` Jacques Garrigue
2002-07-14 10:23       ` William Lovas
2002-07-14  3:26 ` Jacques Garrigue [this message]
2002-07-14 15:47 ` Xavier Leroy
2002-07-16  4:48   ` Oleg
2002-07-16  4:49   ` Oleg

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=20020714122600U.garrigue@kurims.kyoto-u.ac.jp \
    --to=garrigue@kurims.kyoto-u.ac.jp \
    --cc=caml-list@inria.fr \
    --cc=oleg_inconnu@myrealbox.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).