On 10/02/2015 02:21 AM, Dmitri wrote:
> I wondered if this is a current limitation of chunkBy implementation:
>
> // http://dpaste.dzfl.pl/52d6a0c5d0ab
> void bar(int[] foo)
> {
> bool less(int a, int b) // contrived
> {
> return a < b;
> };
>
> foo.sort!less.groupBy;
> }
>
> resulting in:
>
> /opt/compilers/dmd2/include/std/algorithm/iteration.d(1529): Error:
> function f351.bar.SortedRange!(int[],
> less).SortedRange.groupBy!().groupBy.ChunkByImpl!(__lambda1,
> int[]).ChunkByImpl.Group.popFront cannot access frame of function
> f351.bar.SortedRange!(int[], less).SortedRange.groupBy!().groupBy
> ...
>
> I can see that the implementation of chunkBy is nested:
> struct ChunkByImpl
> {
> static struct Group {}
> }
>
> and that the predicate (less in this case) is accessed from the nested
> struct Group which is, probably, what's causing the compilation error.
>
> The question is if this is an implementation error (i.e. Group should
> probably be moved to the top level) or a compiler issue?
>
> Thanks in advance.
This is a known D issue. Currently, objects have a single context
pointer. Here is a bug discussion about it:
https://issues.dlang.org/show_bug.cgi?id=5710
A workaround for your example is making less() static, which removes its
context pointer:
void bar(int[] foo)
{
import std.algorithm : sort;
static bool less(int a, int b) // contrived
{
return a < b;
}
foo.sort!less.groupBy;
}
void main() {}
I've just realized that I don't know how to handle the case where less()
really needs some other state (e.g. it may need to use a local variable
in main). What can we do?
Ali