[bitc-dev] BitC Records Figure fixed

Jonathan S. Shapiro shap at eros-os.org
Thu Dec 23 10:39:02 EST 2004


Swaroop:

Can you explain the orphaned lines descending from _={a:_}?

FYI, the figure came through okay in both versions.


shap

On Wed, 2004-12-22 at 20:09 -0500, Swaroop Sridhar wrote:
> I am sorry that the ASCII figure in my mail was scrambled in my previous 
> note. It looked alright when I composed it. I am resending the whole 
> letter with the figure redrawn, I hope it will not be scrambled again.
> 
> -----------------------------------------------------
> 
> I think the right way to think about records is as a graph of sub-types, 
> rather than a set of types. (I know that this means multiple 
> inheritance, please read till the end)
> 
> The definition of the type of a record in our language should be based 
> on Field Types AND Field ordering AND Field names AND record-name.
> 
> Now, we can construct:
> (The notation is struct_type_name={field_name:field_type,
>                                       field_name:field_type, ... })
> 
> 
> _={_:_}
> |
> |-------|
> |       V
> |     _={a:_}
> |         |
> |         |---------------
> |         |----------    |
> |         |---------     |
> |                        |
> |                        |
> |                        |
> |--------|               |
> |        V               |
> |         _={_:'b}       |
> |                |       v
> |                |------> _={a:int} |
> |
> |
> |
> |--------|
> |        V
> |      s={_:_}
> |    Descendants of this branch should be explicitly declared
> |    (as in single-inheritance)
> |
> |
> |
> |-------|
>          V
>      _={_:_, _:_}
> 
> This looks like multiple inheritance. But, this is a LIMITED kind of 
> multiple inheritance, and my first thought is that it is OK because,
> 
> i) Named Records:
>      Two records with cannot have the same name with different 
> structures in the same scope.
> 
> ii) Unnamed Records:
>      Two records whose structures are the same, are of the same type.
> 
> In other words, in the above graph, each attribute of a particular type 
>   can be traced back to precisely ONE parent, and hence we will avoid 
> the problems introduced by c++ style multiple inheritance.
> 
> Now, the advantage we get from this mechanism is that
> the type of the function
> 
> fun x -> x.a
> 
> is _={a:'b} -> 'b, (NOT a set of all plausible record types)
> 
> and x could be {a:int}, {a:<whatever>}, {a:int, b:byte, c:unboxed record 
> p}, s={a:int} , etc, but does not take in {_:int, b:_}.
> 
> And, type s = {a:int}; fun x:s -> x.a does not take any arbitrary {a:int}.
> 
> Also, different structures with same field names are OK (unlike ML), and 
> the unification decision is based on the other parameters in determining 
> the type. We cannot drop the field names from the type anyway, whether 
> we like it or not.
> 
> I think this solves all of the problems we raised, but I am sure it will 
> cause other problems. There should be some reason why this is not done 
> in ML. I will speak to someone in the PL lab tomorrow, or read more 
> about it to find out.
> 
> 
> Thanks,
> Swaroop.
> _______________________________________________
> bitc-dev mailing list
> bitc-dev at coyotos.org
> http://www.coyotos.org/mailman/listinfo/bitc-dev
-- 
Jonathan S. Shapiro <shap at eros-os.org>



More information about the bitc-dev mailing list