Pure and Structs
dsimcha
dsimcha at yahoo.com
Fri Dec 26 19:28:47 PST 2008
== Quote from dsimcha (dsimcha at yahoo.com)'s article
> I'm trying to annotate some code with pure and nothrow (mostly just to test it
> out and give feedback at this point), and I've noticed one very irritating
> thing. If I use a struct as follows:
> struct LameStruct {
> uint foo;
> uint bar;
> void doStuff() {
> foo++;
> bar++;
> }
> }
> void foo() {
> LameStruct lamestruct;
> s.doStuff();
> }
> foo() cannot be annotated as pure in this case because technically, it calls
> doStuff(), which modifies lamestruct. However, I think in this fairly simple
> case, DMD could reasonably figure out that this function is still
> referentially transparent and safe for multithreading, at least if LameStruct
> is defined in the same module as foo(). Of course, no other function can have
> access to lamestruct before foo() is called because it is created within
> foo(). Furthermore, doStuff() only modifies value types that it owns, and the
> return type is void.
> Will pure eventually be expanded to deal with more cases where the referential
> transparency and inherent thread-safety of a function is obvious to humans,
> like these, or is this simply asking too much?
Oh, and I just realize my silly mistake and I apologize. Of course nobody writes
referentially transparent functions that return void. Please pretend foo()
returns something that would be consistent with it being pure.
More information about the Digitalmars-d
mailing list