DMD 0.148 - scope guard
Kyle Furlong
kylefurlong at gmail.com
Sun Feb 26 13:15:23 PST 2006
Kyle Furlong wrote:
> Dawid Ciężarkiewicz wrote:
>> Kyle Furlong wrote:
>>> for any scope:
>>>
>>> in
>>> {
>>> }
>>> out
>>> {
>>> }
>>> failure
>>> {
>>> }
>>> success
>>> {
>>> }
>>> body
>>> {
>>> }
>>>
>>> Pros: fits into and expands current language structures
>>> Cons: still a bit verbose as compared to current syntax
>>
>> I'm sorry to say but IMO this miss the whole point.
>>
>> Current keywords: in, out, body are place-insensitive . They are just
>> blocks
>> that may be moved relatively for themselves and this will not change
>> anything. The whole point in "scope guarding" is that expression you type
>> _registers_ some piece of code (to be called in some conditions) in place
>> where it appears.
>>
>> You gain nothing with such syntax. If you want to deal with whole
>> scope then
>> you can use finally and catch blocks.
>>
>> Examples:
>>
>> Current syntax:
>> void LongFunction()
>> {
>> foo1();
>> on_scope_failure clean_what_foo1_did();
>>
>> foo2();
>> on_scope_failure clean_what_foo2_did();
>>
>> foo3();
>> on_scope_failure clean_what_foo3_did();
>>
>> foo4();
>> }
>>
>>
>> What I understand from your proposal:
>> void LongFunction()
>> {
>> foo1();
>> failure {
>> on_scope_failure clean_what_foo1_did();
>> }
>> body {
>>
>> foo2();
>>
>> failure {
>> on_scope_failure clean_what_foo2_did();
>> }
>> body {
>> foo3();
>> failure {
>> on_scope_failure clean_what_foo3_did();
>> }
>> body {
>> foo4();
>> }
>> }
>> }
>>
>> }
>>
>> If you think about:
>> void LongFunction()
>> {
>> foo1();
>> failure{
>> clean_what_foo1_did();
>> }
>>
>> foo2();
>> failure {
>> clean_what_foo2_did();
>> }
>> foo3();
>> failure {
>> on_scope_failure clean_what_foo3_did();
>> }
>>
>> foo4();
>> }
>>
>> Then concept is OK, but you can no longer say this "will fit and expand
>> current syntax", because it's used totally diffrent from body {} in
>> {} out
>> {} blocks.
>
> That is definitely *NOT* what I was saying *AT ALL*. Obviously that is a
> terrible syntax.
>
> Here's what it would look like:
>
> Current syntax:
> void LongFunction()
> {
> foo1();
> on_scope_failure clean_what_foo1_did();
>
> foo2();
> on_scope_failure clean_what_foo2_did();
>
> foo3();
> on_scope_failure clean_what_foo3_did();
>
> foo4();
> }
>
>
> What I understand from your proposal: (how it should have been)
> void LongFunction()
> failure
> {
> clean_what_foo1_did();
> clean_what_foo2_did();
> clean_what_foo3_did();
> clean_what_foo4_did();
> }
> body
> {
> foo1();
> foo2();
> foo3();
> foo4();
> }
>
> I think you missed the point that each function call does not introduce
> a new scope. Now, its true that if you wanted the operations foox() to
> each be in its own scope, then it would look like this:
>
> void LongFunction()
> {
> failure
> {
> clean_what_foo1_did();
> }
> body
> {
> foo1();
> }
> failure
> {
> clean_what_foo2_did();
> }
> body
> {
> foo2();
> }
> failure
> {
> clean_what_foo3_did();
> }
> body
> {
> foo3();
> }
> failure
> {
> clean_what_foo4_did();
> }
> body
> {
> foo4();
> }
> }
David has brought some things to my attention on IRC that invalidate this syntax, sorry for the clutter.
More information about the Digitalmars-d
mailing list