Thread overview
cannot access frame of function
Sep 18, 2017
Alex
Sep 18, 2017
user1234
Sep 18, 2017
ag0aep6g
Sep 18, 2017
user1234
Sep 18, 2017
Alex
Mar 23, 2018
Jordan Wilson
Mar 23, 2018
Alex
September 18, 2017
Hi all,
given this code:

import std.algorithm.iteration : sum, cumulativeFold;

void main()
{
	double[5] a;
	a = 0;
	foreach(el; a) assert(el == 0);
	a[0] = 1.0;
	a[1] = 2.0;
	a[2] = 3.0;
	a[3] = 4.0;
	a[4] = 5.0;
	foreach(el; a) assert(el != 0);
	auto asum = a[].sum;
	auto jProbs = a[].cumulativeFold!((a, b) => (a + b)/asum);
}

the last line does not compile.

I found
http://forum.dlang.org/post/mailman.4097.1499105927.31550.digitalmars-d-bugs@puremagic.com
and
https://issues.dlang.org/show_bug.cgi?id=11886

What I do not understand, how my example differs from the fixed bug?
September 18, 2017
On Monday, 18 September 2017 at 14:45:25 UTC, Alex wrote:
> Hi all,
> given this code:
>
> import std.algorithm.iteration : sum, cumulativeFold;
>
> void main()
> {
> 	double[5] a;
> 	a = 0;
> 	foreach(el; a) assert(el == 0);
> 	a[0] = 1.0;
> 	a[1] = 2.0;
> 	a[2] = 3.0;
> 	a[3] = 4.0;
> 	a[4] = 5.0;
> 	foreach(el; a) assert(el != 0);
> 	auto asum = a[].sum;
> 	auto jProbs = a[].cumulativeFold!((a, b) => (a + b)/asum);
> }
>
> the last line does not compile.
>
> I found
> http://forum.dlang.org/post/mailman.4097.1499105927.31550.digitalmars-d-bugs@puremagic.com
> and
> https://issues.dlang.org/show_bug.cgi?id=11886
>
> What I do not understand, how my example differs from the fixed bug?

asum is a lazy range and the error comes from this.
Let's say that if you replace  asum by 1.23 then the code compiles.
September 18, 2017
On 09/18/2017 08:25 PM, user1234 wrote:
> On Monday, 18 September 2017 at 14:45:25 UTC, Alex wrote:
[...]
>> import std.algorithm.iteration : sum, cumulativeFold;
>>
>> void main()
>> {
>>     double[5] a;
[...]>>     auto asum = a[].sum;
[...]
> asum is a lazy range and the error comes from this.

asum is not a range. It's a double.

> Let's say that if you replace  asum by 1.23 then the code compiles.

Doesn't work for me. This still fails compilation with the same error:

----
import std.algorithm.iteration : sum, cumulativeFold;
void main()
{
    double[5] a;
    auto asum = 1.23;
    auto jProbs = a[].cumulativeFold!((a, b) => (a + b)/asum);
}
----
September 18, 2017
On Monday, 18 September 2017 at 18:49:54 UTC, ag0aep6g wrote:
> On 09/18/2017 08:25 PM, user1234 wrote:
>> On Monday, 18 September 2017 at 14:45:25 UTC, Alex wrote:
> [...]
>>> import std.algorithm.iteration : sum, cumulativeFold;
>>>
>>> void main()
>>> {
>>>     double[5] a;
> [...]>>     auto asum = a[].sum;
> [...]
>> asum is a lazy range and the error comes from this.
>
> asum is not a range. It's a double.
>
>> Let's say that if you replace  asum by 1.23 then the code compiles.
>
> Doesn't work for me. This still fails compilation with the same error:
>
> ----
> import std.algorithm.iteration : sum, cumulativeFold;
> void main()
> {
>     double[5] a;
>     auto asum = 1.23;
>     auto jProbs = a[].cumulativeFold!((a, b) => (a + b)/asum);
> }
> ----

Aw right, i had put 1.23 directly in the lambda. So, OP, you can dismiss my comment.
September 18, 2017
On Monday, 18 September 2017 at 18:49:54 UTC, ag0aep6g wrote:
>
> Doesn't work for me. This still fails compilation with the same error:
>
> ----
> import std.algorithm.iteration : sum, cumulativeFold;
> void main()
> {
>     double[5] a;
>     auto asum = 1.23;
>     auto jProbs = a[].cumulativeFold!((a, b) => (a + b)/asum);
> }
> ----

So, this is a bug, isn't it? I assume, I should file it then...


March 23, 2018
On Monday, 18 September 2017 at 21:58:39 UTC, Alex wrote:
> On Monday, 18 September 2017 at 18:49:54 UTC, ag0aep6g wrote:
>>
>> Doesn't work for me. This still fails compilation with the same error:
>>
>> ----
>> import std.algorithm.iteration : sum, cumulativeFold;
>> void main()
>> {
>>     double[5] a;
>>     auto asum = 1.23;
>>     auto jProbs = a[].cumulativeFold!((a, b) => (a + b)/asum);
>> }
>> ----
>
> So, this is a bug, isn't it? I assume, I should file it then...

I have this same issue. Anyone have any thoughts on a workaround?

For example, my attempt at an exponential moving average doesn't compile:
auto ema(Range,T) (Range rng, int period, T seed) {
    return rng.cumulativeFold!((a,b) => a+(2.0/(period+1))*(b-a))(seed.to!double);
}

So I ended up with this:
auto ema(Range,T) (Range rng, int period, T seed) {
    struct EMA(Range) {
        double currentValue;
        double weighting;
        Range rng;
        this (Range r, int p, double s) {
            currentValue = s;
            weighting = 2.0 / (p+1);
            rng = r;
        }
        auto front() { return currentValue; }
        auto popFront() {
            rng.popFront;
            if (!rng.empty){
                currentValue += (rng.front - currentValue)*weighting;
            }
        }
        auto empty() { return rng.empty; }
    }
    return EMA!Range(rng,period,seed.to!double);
}

Thanks,

Jordan


March 23, 2018
On Friday, 23 March 2018 at 03:38:22 UTC, Jordan Wilson wrote:
>
> I have this same issue. Anyone have any thoughts on a workaround?
>
For completeness:
https://issues.dlang.org/show_bug.cgi?id=17841