On Thu, 23 Sep 2010 10:05:45 -0400, Steven Schveighoffer
<schvei...@yahoo.com> wrote:
On Wed, 22 Sep 2010 21:48:19 -0400, Robert Jacques <sandf...@jhu.edu>
wrote:
On Wed, 22 Sep 2010 13:10:36 -0400, Steven Schveighoffer
<schvei...@yahoo.com> wrote:
On Wed, 22 Sep 2010 12:00:16 -0400, Robert Jacques <sandf...@jhu.edu>
wrote:
What about value types?
Value types are implicitly convertable to immutable, so they can be
strongly-pure.
No their not. Remember, arrays and other structs are value types in the
type system. Logically, they may be reference types, but as far as
their type signature goes, they are value types.
Arrays are not value types. A value type is one that contains no
references, no matter how deep. It is irrelevant if you have to spell
out the references or not.
Arrays are implemented as a struct. And as per the language spec:
(http://www.digitalmars.com/d/2.0/struct.html) all structs are value types
*to the compiler*. This doesn't mean that logically, from the programmer's
point of view, they aren't providing reference semantics.
another example of something that is not a value type:
alias int * iptr;
foo(iptr p);
iptr is not a value type just because you don't see any * in the
signature.
*sigh* I explicitly referred to the type system/compiler. And to the type
system iptr is a pointer, no matter what you call it.
But the compiler will be able to tell. I think adding a
__traits(isStronglyPure, symbol) will be good for those rare occasions
where you really want to ensure purity.
static assert(__traits(isStronglyPure, foo));
-Steve
This would work, but it wouldn't be self-documenting, etc.
Hm... OK, well I disagree, it looks like it's documented to me. I don't
see a difference between tagging something as strongly pure and putting
in the static assert (except verbosity of course). I will note that I
think the above would be a rare situation.
To clarify, self-documenting => be able to automatically shows up in ddoc,
etc.