Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [mdt-ocl.dev] Arrow accessor conversion for non-collections

Hi Ed,
 
I think that it would be very wrong for null->size() = 1 to be true and null->isEmpty() to be false.
I think of it just as of notation equal to wrapping null into a collection containing one undefined instance. Therefore, I don't find it incorrect that null->size()=1 is true and
null->isEmpty() is false. IMO you just don't like the way it looks because it provokes to think of     null->size()      as of "size of undefined value" and    null->isEmpty()         as of "validation of emptiness of undefined value".
 
I would rather ban null conversion to not-null altogether than convert null to Set{null}.
I would rather ban the whole conversion to single-value collection itself since I cannot invent use cases which would make this language construction sensible. But I think it is impossible due to compatibility considerations.
 
Cheers,
- Alex.
 
P.S. BTW, I thought you would say that the exceptional conversion of null into an empty collection would be a breakage of the Liskov Substitution Principle...


From: mdt-ocl.dev-bounces@xxxxxxxxxxx [mailto:mdt-ocl.dev-bounces@xxxxxxxxxxx] On Behalf Of Ed Willink
Sent: Thursday, January 21, 2010 2:24 PM
To: mdt-ocl.dev@xxxxxxxxxxx
Subject: Re: [mdt-ocl.dev] Arrow accessor conversion for non-collections

Hi Alex

On 21/01/2010 08:18, Alexander Igdalov wrote:
Hi Ed,
 
It seems to be a weird example. Why should someone use implicit convertion to a collection and use a collection operation when there is a simpler way to express it:
 
self.wife.oclIsUndefined() implies self.wife.gender = Gender::female
?
True. It's a stupid example and apart from the oclCamelCase is easier to read.

A more realistic example comes from thinking about null.

null is an undefined instance of any type.

Set{null} is defined collection containing one undefined instance.
Set{} is a defined collection containing no instance.

I think that it would be very wrong for null->size() = 1 to be true and null->isEmpty() to be false.

I would rather ban null conversion to not-null altogether than convert null to Set{null}.

Thinking more about the implicit conversion to collections using an arrow, I cannot invent any good use case where it could be helpful... It seems that it could be equally well expressed using other language constructions. Do you agree?
As regards the collection type (Bag, Set or other), I think it doesn't matter much. Set is more backwards compatible but Bag fits too.
I have a weak preference for Collection.
Set is more MDT/OCL compatible since the Bag{} conversion is not implemented.
Bag is less useful and so forces an explicit asSet() if anything clever is to be performed.
Collection is even less useful and so forces an explicit asXxx() if anything clever is to be performed

    Ed

Cheers,
- Alex.

From: mdt-ocl.dev-bounces@xxxxxxxxxxx [mailto:mdt-ocl.dev-bounces@xxxxxxxxxxx] On Behalf Of Ed Willink
Sent: Wednesday, January 20, 2010 11:47 PM
To: mdt-ocl.dev@xxxxxxxxxxx
Subject: Re: [mdt-ocl.dev] Arrow accessor conversion for non-collections

Hi Alex

The purpose of the conversion is to make 0..1 properties easy to use.

Thus in 7.5.3 "Navigation over Associations with Multiplicity Zero or One" we get

    self.wife->notEmpty() implies self.wife.gender = Gender::female

so creation of Set{null} would completely invalidate the usage.

My raised issue has now been allocated Issue 14981.

Bag{} and Set{x} are not quite contradictory, just a little inconsistent. The issue suggests
changing to Bag{} and Bag{x}, so that the compile-time type is predictable. I changed
the MDT-OCL 1.3.0 synthesis of Set{x}-> to x.oclAsCollection()-> so that the null-ness
of x determines the collection content. Unfortunatel;y Collection<T> is insufficient to allow
some exiusting unit tests to work that expect Set.

    Ed


On 20/01/2010 18:35, Alexander Igdalov wrote:
Hi all,
 
The resolution of issue 10438 made `null->foo()` a synonym of `Bag{}->foo()`. As Ed has mentioned earlier this contradicts 7.5.3 which suggests wrapping the _expression_ source to a Set, i.e. `x->foo()` becomes `Set{x}->foo()` if `x` is not a collection.
 
Does anyone see why there is that exception from the general rule for null? If not I will raise an OMG issue for that.
 
Since `null->foo()` is allowed, what should it be converted to? Should it be `Set{}->foo()` or `Set{null}->foo()`? I would prefer the latter because only in this case we could construct a complete AST at compile time (see guideline at 9.6).
 
Regards,
- Alex.
_______________________________________________ mdt-ocl.dev mailing list mdt-ocl.dev@xxxxxxxxxxx https://dev.eclipse.org/mailman/listinfo/mdt-ocl.dev
No virus found in this incoming message. Checked by AVG - www.avg.com Version: 9.0.730 / Virus Database: 271.1.1/2634 - Release Date: 01/20/10 09:12:00

_______________________________________________ mdt-ocl.dev mailing list mdt-ocl.dev@xxxxxxxxxxx https://dev.eclipse.org/mailman/listinfo/mdt-ocl.dev
No virus found in this incoming message. Checked by AVG - www.avg.com Version: 9.0.730 / Virus Database: 271.1.1/2634 - Release Date: 01/20/10 09:12:00


Back to the top