On Thu, 22 Sep 2011 22:18:29 +0100, Jonathan M Davis <[email protected]> wrote:
On Thursday, September 22, 2011 14:10 Steven Schveighoffer wrote:
No, the parameter types can be const, and can accept mutable arguments.
The main point is, the return value has to be proven to be *unique*. The
only way to do this with pure functions is to prove that the result is
*not* a subset of the parameters. That's all.

Observe:

char[] foo(const(char)[] x) pure {...}

There is no way to write the body of this function such that the return
value is a substring of x. So you are guaranteed that the result is *new
memory*, and since it cannot be stored globally anywhere (per pure rules),
it's guaranteed to be unique, and should be implicitly castable to
immutable.

Even if you pass a char[] into foo.

Hmmmm. You're right. Bleh. This is overly complicated. It works, but sorting it out is a pain. And trying to explain to newbies why and when a function can have its return value implicitly converted to immutable... Well, it's going to be an issue - just like with strong purity, but in that case at least, we can pretty much just let the compiler optimize where it's going to optimize and not generally worry about what's strong or weakly pure unless you're really trying to optimize code. In this case, however, programmers are going to need
to understand in order to use it properly.

The key word here is "unique". It "makes sense" that "unique" data can be implicitly cast to immutable, because it only exists once, in one place, and no-one/thing else knows about it.. therefore it can be considered immutable.

--
Using Opera's revolutionary email client: http://www.opera.com/mail/

Reply via email to