Yield from function?

Profile Anaysis via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jan 30 20:02:29 PST 2017


On Monday, 30 January 2017 at 22:34:11 UTC, TheFlyingFiddle wrote:
> On Monday, 30 January 2017 at 11:03:52 UTC, Profile Anaysis 
> wrote:
>> I need to yield from a complex recursive function too allow 
>> visualizing what it is doing.
>>
>> e.g., if it is a tree searching algorithm, I'd like to yield 
>> for each node so that the current state can be shown visually.
>>
>> I realize that there are several ways to do this but D a yield 
>> version without additional threads would be optimal. I don't 
>> need concurrency or speed, just simple.
>
> If you don't want to use fibers then an alternative to yeilds 
> is to use callbacks during iteration.
>
> Example:
> struct Tree(T)
> {
>    T value;
>    Tree!(T)[] children;
> }
>
> void iterDepth(T)(Tree!(T) tree, void delegate(Tree!T) cb)
> {
>     cb(tree);
>     foreach(child; tree.children)
>     {
>         iterDepth(child, cb);
>     }
> }
>
> unittest
> {
>     auto tree = ... //Make the tree somehow
>     iterDepth(tree, (node)
>     {
>         writeln(node.value);
>     });
> }
>
> Callbacks have their set of problems but it's one of the 
> simpler ways to do this.

This can't be easily because it requires the callback to contain 
the main program(if it depends on the results). Since I am 
already in a multi-threaded environment it would not be easy to 
marshal the data around.

If I run it in it's own thread then it won't block but seems like 
a lot of work for a simple thing.


More information about the Digitalmars-d-learn mailing list