this() immutable
Daniel Davidson
nospam at spam.com
Wed Oct 23 12:47:00 PDT 2013
On Wednesday, 16 October 2013 at 21:11:19 UTC, H. S. Teoh wrote:
> On Wed, Oct 16, 2013 at 10:09:50PM +0200, Daniel Davidson wrote:
> [...]
>> I reported my issue with the `chain` function to this NG and
>> tried
>> to start annotating items used by chain with pure to see how
>> far the
>> thread led. Honestly it was quickly clear that it led too far
>> for me
>> to follow it and someone else indicated the problem had to do
>> with
>> Voldermort types. If there is more I could do to "benefit us
>> all",
>> beyond learning how it works and what to avoid in my own code
>> - I
>> will be glad to try.
>
> Hmm. I just did a quick-n-dirty change to Phobos, and it seems
> to make
> chain() usable with pure code. I'm not sure why the compiler
> didn't
> infer pure for it -- it should. (Or perhaps I'm missing
> something
> obvious -- I didn't run the Phobos unittest so maybe the
> following
> change breaks something.)
>
> - In the Phobos source, edit std/range.d and look for the
> function `auto
> chain(Ranges...)(Ranges rs)` (around line 2022 or
> thereabouts), then
> the struct Result inside this function.
> - Find the ctor for this struct (circa line 2074), and annotate
> it with
> pure.
> - Now the following code compiles:
>
> import std.range;
>
> auto pureFunc() pure {
> return chain([1,2,3], [2,3,4]);
> }
>
> void main() {
> auto r = pureFunc();
> }
>
> This is just a hack, of course. The compiler *should* be able to
> correctly infer that the ctor is pure. So the real fix is to
> find out
> why the compiler isn't doing that.
>
>
> T
I am able to see your code work. However, when I make that change
and try to use chain in a pure function:
foreach(dateRate; chain(trisection[1], trisection[2])) {
Date earlyEnd = min(dateRate.when, end);
result = moveValueInTime(result, ccRate, currentDate,
earlyEnd);
ccRate = dateRate.value;
currentDate = earlyEnd;
if(earlyEnd == end) break;
}
I get: pure function 'plus.tvm.rate_curve.RateCurve.scaleFromTo'
cannot call impure function
'std.range.chain!(SortedRange!(const(TimePointValue!(Date,
CcRate))[], "a.when < b.when"),
SortedRange!(const(TimePointValue!(Date, CcRate))[], "a.when <
b.when")).chain.Result.empty'
So it seems more work is needed for real purity.
Thanks
Dan
More information about the Digitalmars-d-learn
mailing list