Purity
Michel Fortin
michel.fortin at michelf.com
Sat Dec 18 06:37:04 PST 2010
On 2010-12-18 07:46:11 -0500, Don <nospam at nospam.com> said:
> spir wrote:
>> On Sat, 18 Dec 2010 01:08:20 -0800
>> Jonathan M Davis <jmdavisProg at gmx.com> wrote:
>>
>> Thank you for the explanation about strongly pure funcs calling weakly
>> pure ones --this fully makes sense.
>>
>>>> I would like weakly pure to include output funcs, and exclude all
>>>> possibilities to modify (non-local) state.
>>> The problem is that output is accessing global variables - which weakly
>>> pure functions _cannot_ do.
>>
>> Why? What is the rationale for excluding output (I don't mean I/O, only O)?
>
> You're correct in saying that it doesn't affect the operation of the
> program. But in practice, program output is almost always important.
>
> For example, suppose we allowed output to be pure. Then consider:
>
> writeln("Hello, world!");
>
> Since it returns nothing, and has no influence on the future execution
> of the program, the writeln can be dropped from the program.
I agree with that for writeln, the function at global scope, can't be
pure. The reason is simple: it refers to the stdout global variable.
However, if someone was to pass stdout as a non-const function
parameter I think it should work:
pure void fun(File output, string msg) {
output.writeln(msg);
}
void main() {
fun(stdout, msg);
}
File.writeln cannot be strongly pure since it gets the File as a
reference (and so it can't be optimized away), but it can be weakly
pure. One could argue that this is not terribly useful since no
strongly pure functions will be able to do IO, but there might be other
reasons one would want a weakly pure function other than enabling
strongly pure ones. (For one instance of this, see my two posts in the
other discussion "Threads and static initialization".)
--
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/
More information about the Digitalmars-d
mailing list