"with" still sucks + removing features + adding features
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Mon May 18 11:13:21 PDT 2009
Bill Baxter wrote:
> On Mon, May 18, 2009 at 10:46 AM, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> wrote:
>> Johan Granberg wrote:
>>> BCS wrote:
>>>
>>>> Hello Andrei,
>>>>
>>>>> I think "with" is a very dangerous feature due to the way it hides
>>>>> symbols. It essentially makes the feeblest attempt at modular
>>>>> reasoning utterly impossible:
>>>>>
>>>>> int x, y;
>>>>> with (whatever)
>>>>> {
>>>>> y += x;
>>>>> ++x;
>>>>> }
>>>>>
>>>>> Maintenance of any type that is being used with "with" becomes a very
>>>>> dangerous proposition because it can silently change meaning of code.
>>>> I'd be willing to go the half way solution of making accessing a
>>>> shadowing
>>>> symbol an error, resulting in (loudly) not being able to access either.
>>> I think this solution is a good idea but that removing or restricting
>>> anything more regarding with is a bad idea as others have pointed out.
>>>
>>> I'm using with quit a lot and it was one of thous things that attracted me
>>> to D (I get the feeling that D has a quite pragmatic way of looking at
>>> language features, if it's usefull lets have it unless it's harmfull to
>>> other parts of D, sort of.).
>> I personally still think it's a bad feature because it introduces
>> long-distance coupling between symbols defined in two different places, both
>> distinct from the place where the statement is used! Consider:
>>
>> import wyda; // defines symbol write
>> import geeba; // defines struct S { ... }
>>
>> void main()
>> {
>> S s;
>> with (s) {
>> write(5);
>> }
>> }
>>
>> Machiavelly would jump in joy at such code. What did I achieve? I saved a
>> few "s.". What did I lose? The ability so say anything, but absolutely
>> anything on what the code does.
>
> Shouldn't the feature just follow the same rules as module imports do?
>
> If I say
> import foo;
> import bar;
> void main() {
> write(5);
> }
>
> It's fine as long as foo and bar don't both define bar. Why shouldn't
> the same scope resolution mechanism not apply to with?
>
> So in your example write(5) is fine as long as S and some module don't
> both define a write().
>
> I think that's what others were saying in the other thread, too.
> Makes things more consistent too. Given that do you still object to
> with() so vehemently?
I'd be happy if "with" were consistent in the way you describe. Nice idea!
Andrei
More information about the Digitalmars-d
mailing list