This one weird trick allows you to capture loop variables.

Richard (Rikki) Andrew Cattermole richard at cattermole.co.nz
Tue Nov 19 21:59:32 UTC 2024


On 20/11/2024 10:43 AM, Ali Çehreli wrote:
> On 11/19/24 8:50 AM, Richard (Rikki) Andrew Cattermole wrote:
>  > On 20/11/2024 5:43 AM, Ali Çehreli wrote:
> 
>  >> I've always thought opApply is one of the most brilliant
>  >> parts of D. It's easy to see the curly braces of the foreach loop as a
>  >> lambda anyway.
>  >
>  > There are other ways to do it, than just giving it a delegate.
>  >
>  > I.e. hidden state struct and then range over it.
>  >
>  > Still on my todo list to look into, as it solves the attribute problem
>  > of opApply also.
> 
> Please also keep in mind, as mentioned elsewhere in this thread, e.g. 
> tree traversal is trivial with opApply but not with ranges. That's 
> because the delegate is there to call regardless of how deeply recursed 
> we are in traversal. With ranges, a range must maintain the state of 
> traversing.
> 
> So, I guess both styles have their strong points.
> 
> Ali

Indeed, its not something I'd consider for normal data structures (I 
think the only place I use them as greedy with recursive calling, is in 
my allocators). It's not a pattern that immediately comes to mind.

In saying that, yeah there are reasons to want opApply in its current 
form, and given the amount of code that uses it already I was never on 
the side of removal :)

In terms of transversal:

```d
struct S {
	DS* ds;
	Node* node;

	ref V front() {
		return node.value;
	}
}

s.front
```

Is no different than:

```d
{
	Node* node;

	del(node.value);
}
```

You have split out the already existing state that's stored in the 
function out of it.

So you can do a ton of what opApply does today with this approach.



More information about the Digitalmars-d mailing list