Thread overview |
---|
September 18, 2017 cannot access frame of function | ||||
---|---|---|---|---|
| ||||
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 Re: cannot access frame of function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alex | 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 Re: cannot access frame of function | ||||
---|---|---|---|---|
| ||||
Posted in reply to user1234 | 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 Re: cannot access frame of function | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | 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 Re: cannot access frame of function | ||||
---|---|---|---|---|
| ||||
Posted in reply to ag0aep6g | 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 Re: cannot access frame of function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alex | 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 Re: cannot access frame of function | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jordan Wilson | 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 |
Copyright © 1999-2021 by the D Language Foundation