On 16/02/2012 13:05, bearophile wrote:
Stewart Gordon:

But if the method is pure, the compiler can automatically implement this as an 
optimisation.

Functions like toHash take nothing and return a single size_t (hash_t). Often 
you want
to compute the hash value lazily, but this is not possible if toHash needs to 
be pure.

Hence my point. The laziness could be implemented on the compiler side, thereby bypassing the contracts of purity and constancy.

For example, if the source code is

    string toString() const pure {
        return ...;
    }

then the compiler would generate code equivalent to

    bool _has_cached_toString;
    string _cached_toString;

    string toString() {
        if (!_has_cached_toString) {
            _cached_toString = ...;
            _has_cached_toString = true;
        }
        return _cached_toString;
    }

and moreover, clear the _has_cached_toString flag whenever any of the members on which the cached value depends is changed.

A explicit optional @memoize annotation (similar to the std.functional.memoize) 
allows
toHash to be both catching and safe. (I was also thinking about the idea of a
@trusted_pure, but I don't like it, and I think it causes chaos).

Bye,
bearophile

Reply via email to