On Sat, 14 Feb 2015 19:59:58 +0000, Gary Willoughby wrote:
> On Saturday, 14 February 2015 at 12:24:51 UTC, ketmar wrote:
>> On Sat, 14 Feb 2015 11:29:28 +0000, Jack Applegame wrote:
>>
>>> why std.conv.to is not pure?
>>>
>>> string foo(real v) pure { return v.to!string; }
>>> // Error: pure function 'foo' cannot call impure function
>>> 'std.conv.to!string.to!(real).to'
>>
>> 'cause float->string conversion is damned hard task. to perform this
>> conversion `to!` falls back to `formatValue` from "std.format",
>> which in turn using `snprintf()` from libc.
>
> Forgive me being a bit dense but that doesn't necessarily mean it's
> impure though, right?yes, you are right, it *may* be pure. yet `snprintf()` can't be marked as `pure`, so it contaminates everything. and there are no guarantees that `snprintf()` is pure even for known arguments (compiler can't prove that, and libc is free to do any funny things in it), so it will be wrong to just force-reimport it as `pure`. tl;dr: we need native D float->string converter to allow purity in this case. you are free to force-hack purity flag on function if you want, but this can be wrong and may lead to various heisenbugs. native pure D converter will also allow CTFE, btw, which is impossible now.
signature.asc
Description: PGP signature
