Implementing Pure Functions
Byakkun
byakkun at myopera.com
Fri Jun 17 02:12:12 PDT 2011
On Fri, 17 Jun 2011 10:49:43 +0300, Don <nospam at nospam.com> wrote:
> Andrei Alexandrescu wrote:
>> On 6/17/11 1:56 AM, Kagamin wrote:
>>> Andrei Alexandrescu Wrote:
>>>
>>>> This has sparked an interesting discussion, to which I added my
>>>> bit.
>>>
>>> int fun(int a) pure { if (a > 10) writeln("I'm impure); }
>>>
>>> As I understand, even if some calls to a function have some
>>> repeatability properties, this doesn't mean the function is pure. In
>>> this example fun is obviously impure. Here one can talk about
>>> allowing to call impure functions from pure ones, but that's a way
>>> different task.
>> Right. I gave that example within the context of the discussion, which
>> considered purity a path-sensitive property. By that definition, if fun
>> is provably never invoked with a > 10, then it's effectively pure.
>> Andrei
>
> And that's an interesting thing about CTFE: although it can never do
> anything impure, it can call impure functions, provided it avoids the
> impure bits of them:
>
> int foo(int n)
> {
> static int x = 56;
> if (n<10)
> return n;
> ++x;
> return x;
> }
>
> static assert(n(5) == 5);
>
> Likewise, it can never doing anything unsafe, but can call unsafe
> functions.
>
> bool bar(int n)
> {
> if (n < 2) return true;
> corruptTheStack();
> return false;
> }
>
> static assert(bar(1));
I was wondering if you could not implement [weak] purity in the language
so that it requires the programmer to use contracts to insure that side
effects newer happen. I would imagine that this should work with the
semantic analysis the compiler provides without adding a specialized
theorem prover.
(Note: my knowledge of compilers and semantic analysis is fairly limited
so ignore this if it is plain stupid).
--
Using Opera's revolutionary email client: http://www.opera.com/mail/
More information about the Digitalmars-d
mailing list