"with" still sucks + removing features + adding features

Georg Wrede georg.wrede at iki.fi
Mon May 18 18:40:21 PDT 2009


Andrei Alexandrescu wrote:
> 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!


Then we could have "an implicit with" in effect all the time!

I.e., every time i use 'write', and there's no ambiguity, I wouldn't 
have to write foo.write or bar.write. Saves a lot of ink! Yessss. And 
this should not be hard to implement at all.



Except that code would then become hard to analyze.

End result: using 's.' really isn't such a bad alternative.



More information about the Digitalmars-d mailing list