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