Version française
Home     About     Download     Resources     Contact us    
Browse thread
Re: anonymous record types in variants
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Pierre Weis <Pierre.Weis@i...>
Subject: Re: anonymous record types in variants
> I don't agree with Anton. The reason I want variants with anonymous record
> arguments is to name the fields explicitly. I don't want to incur a runtime
> cost of an extra indirection. The compilation of named fields vs. tuples
> would be the same. That's why a construction like 
> 
> >         match x with A r -> ... r.x ... r.y ...
> 
> would not be desirable, since it requires the record r to be stored as  a
> separate block from the A r value. If you restrict record access for these
> anonymous records as Xavier pointed out
> 
> >         match x with A{lbl1 = x; lbl2 = y} -> ...
> 
> 
> then you can implement them as efficiently as a variant with a tuple
> argument.
> 
> -Manuel

An even better scheme would be to allow access to the fields with the
dot notation, considering that a value of type

type t = A of {labl1 : int; labl2 : bool}

is in fact a tuple with named field tagged with A (the treatment is
completely similar to constructors with tuple arguments, and as the
value A (..., ...)  cannot be pattern matched to extract the tuple,
then A {...} could not be pattern matched to extract the record).

Then

match expr with A {lbl1 = _; lbl2 = _} as x -> x.lbl1 ... x.lbl2

is conceivable (easy to compile, not too difficult to type check).

Moreover, this could be easily extended to mutable labels, using the
usual syntax: if t is defined as

type t = A of {mutable labl1 : int; mutable labl2 : bool}

we could write

match expr with
 A {lbl1 = _; lbl2 = _} as x ->
   x.lbl1 <- x.lbl1 + 1 ... x.lbl2 <- not x.lbl2

I think this is not too difficult to understand (given the simliarity
with the actual semantics of constructors in Objective Caml) and not
too difficult to implement. Last but not least, it does not require
any extra syntax!

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://cristal.inria.fr/~weis/