1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
template map(fun...)
{
auto map(R)(R r)
{
return MapResult!(fun, R)(r);
}
}
struct MapResult(alias fun, R)
{
R _input;
@property bool empty() { return _input.length == 0; }
@property auto front() { return fun(_input[0]); }
void popFront() { _input = _input[1..$]; }
}
class Foo
{
int baz() { return 1; }
void bar()
{
auto s = [1].map!(i => baz()); // compiles
auto r = [1].map!( // returns MapResult-1
// lambda1
i =>
[1].map!( // returns MapResult-2
// lambda2
j =>
baz()
)
); // compiles <- error
// When lambda1 is called in MapResult-1.front(), it was changed to
// TOKfunction in functionResolve. But in that time, MapResult-2 semantic3
// was not yet finished, then the lambda2 call in MapResult-2.front()
// could not access to enclosing scope frame to call baz().
// To fix the issue, MapResult-2 semantic3 should be finished during the
// lambda1 body analysis.
}
}
class Bar
{
int baz;
void bar()
{
auto s = [1].map!(i => baz); // compiles
auto r = [1].map!(
// lambda1
i =>
[1].map!(
// lambda2
j =>
baz
)
); // compiles <- error
}
}
/*******************************************/
struct ChunkByImpl(alias eq)
{
struct Group
{
int[] start;
int[] current;
void popFront()
{
// In here:
// SortedRange.pred == (a, b) => a @ test14978b()
// ChunkByImpl.eq == (a, b) => pred(a, b) @ SortedRange.groupBy()
//
// The context deduction should be:
// First pred is deduced to function pointer,
// and then, eq is also deduced to function pointer because pred is function pointer.
//
// Therefore, when ChunkByImpl is instantiated in groupBy(), its semantic3
// needs to be invoked to analyze ???
eq(start, current);
}
}
}
struct SortedRange(alias pred)
{
int[] input;
auto groupBy()
{
ChunkByImpl!(
(a, b) => pred(a, b)
) r;
}
}
void test14973b()
{
SortedRange!(
(a, b) => a
) r;
}
|