[Issue 16272] New: Yield like semantics for function execution

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Tue Jul 12 14:42:32 PDT 2016


https://issues.dlang.org/show_bug.cgi?id=16272

          Issue ID: 16272
           Summary: Yield like semantics for function execution
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Windows
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: TeddyBear12311 at gmail.com

In some cases it would be nice to break the execution flow of a function and
re-continue at a later time. This reduces bloat and complexity.


int A(int i)
{
    ...
    ?yield;
    ...
    ?yield;
    ...
    ?yield;
    ...
    return 0;
}

void B()
{
    int x = 3;
    auto uuid = yield A(ref x)  // Calls A but activates ?yields
    //returns from A after first ?yield
    ...    
    x = 6;
    continue!uuid(A(ref x)) // continues
    // returns from A after second ?yield
    ...
    continue!uuid(A(ref x));
    // returns from A after third ?yield
    ...   
    break!uud(A()); 
    // breaks out of A as it A executed a return statement. No return value is
given.


}

All inputs to A are by ref when yielding so they can be modified. The break is
optional but allows one to terminate execution of the function.  Every continue
must match a ?yield up to a break.

uuid's are simply ways to identify different function execution strains.

Does this allow for total chaos if used wrong? Yes! It's more valuable to
create simple and complex state machines very effectively with minimal work and
better understanding of the complexity. Each ?yield statement can be seen as a
pause in the state machine between transitions.

--


More information about the Digitalmars-d-bugs mailing list