scope(exit) considered harmful

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Nov 8 13:27:40 PST 2009


Justin Johansson wrote:
> dsimcha Wrote:
> 
>> Hey, I never programmed at all seriously in C++ before coming to D and I somehow
>> figured out scope(exit).  I'm not even sure you'd be able to pry scope(exit) out
>> of my cold, dead hands.  I might super-glue it to my hands on my death bed.
>>
>> Example of where you could do stuff with scope statements that would be **almost
>> impossible** with try/catch/finally:
>>
>> enum myConvenientMixin =
>> q{
>>     myRegionAllocator.init();
>>     scope(exit) myRegionAllocator.destroy();
>> };
>>
>> void someFunction() {
>>     mixin(myConvenientMixin);
>>
>>     // Build some really complicated data structure using
>>     // myRegionAllocator.
>> }
>>
>> With finally only, myRegionAllocator would be so horribly ugly to use in the
>> presence of throwing code that noone would ever even consider doing such a thing.
>>  With scope(exit) and mixins, you've solved the problem of the memory getting
>> freed in one line of code and don't even need to think about it when writing the
>> rest of your function.
> 
> I know what you mean, but it's not like "D" stands for "Discovered America".
> scope(exit) is just some syntactic sugar which stack allocated objects in C++
> have been able to do since Bjarne Stroustrup (C++ inventor) was in knee-high
> locks, umm, socks :-)
> 
> class Lock
> {
>   Foo foo;
> 
>   Lock( Foo aFoo): foo( aFoo) {
>    // lock Foo resource
>    lock( foo);
>  }
> 
>   ~Lock() {
>   // unlock Foo resource
>    unlock( foo);
>   }
> }
> 
> 
> void myFunc( Foo foo)
> {
>   Lock( foo);
> 
>   // do something with the locked resource
>   // that might throw an exception
>   // ... processing()
> 
>   // Note that the Foo resource is acquired and
>   // upon entry to this function and released
>   // when the function scope exits irrespective
>   // of whether an exception is thown by
>   // processing() or not.
> }
> 
> No sign of any ugly try/finally here; yet achieves safe outcome.
> 
> C++ constructors/destructors and stack-unwinding mechanism
> are considered FREAKING AWESOME.
> 
> -- Justin :-)
> 

I can't process how this is great and scope(exit) isn't. For sure, 
putting a Lock inside an if (true) statement will make the destructor 
get called at the scope's exit (let me emphasize: *scope's exit*), not 
function's exit. That is, in your rant you could easily replace 
scope(exit) with scoped objects and get the same frustration.

Andrei



More information about the Digitalmars-d mailing list