On 06/16/2010 05:47 AM, Steven Schveighoffer wrote:
On Tue, 15 Jun 2010 22:23:15 -0400, Andrei Alexandrescu
<[email protected]> wrote:

bearophile wrote:
I have counted about 200 usages of std.contracts.enforce() inside
Phobos. Can you tell me what's the purpose of enforce() in a language
that has built-in Contract Programming?

You need to read TDPL for that :o).

And what are the purposes of std.contracts.AssumeSorted()? Is it
useful for something?

AssumeSorted was an experiment. I think it has drawbacks that I don't
know how to address, so I'll retire it.

Hm... what are the drawbacks (besides it not being enforced)? I thought
it was a good solution.

Sorry I took so long (over one month!) to reply to this. I've delayed the reply to the point when it could be integrated within the upcoming thread about improving std.algorithm.find.

The problem with AssumeSorted is that generally predicates in D (and also in most other languages) are not easy to compare. Let's first recall AssumSorted's definition. It's just a wrapper:

/**
Passes the type system the information that $(D range) is already
sorted by predicate $(D pred). No checking is performed; debug builds
may insert checks randomly. To insert a check, see $(XREF algorithm,
isSorted).
 */
struct AssumeSorted(Range, alias pred = "a < b")
{
    /// Alias for $(D Range).
    alias Range AssumeSorted;
    /// The passed-in range.
    Range assumeSorted;
    /// The sorting predicate.
    alias pred assumeSortedBy;
}

/// Ditto
AssumeSorted!(Range, pred) assumeSorted(alias pred = "a < b", Range)
(Range r)
{
    AssumeSorted!(Range, pred) result;
    result.assumeSorted = r;
    return result;
}

The recommended way to use the facility is:

int[] a = [ -1, 0, 1, 2, 3, 4, 5 ];
assert(find(assumeSorted(a), 3) == [ 3, 4, 5 ]);

find() uses simple means to detect that its first argument has type AssumeSorted and takes advantage of that when searching (specifically by doing binary search).

So far so good. The problem ensues when we want to make sure that the sorting predicate is in sync with the search predicate. For example, if the search predicate is "==" then it's okay to use "<" or ">" as a sorting predicate. But searching for "a.zip == b.zip" in a range sorted by "a.name < b.name" is not okay.

If predicates were all expressed as strings, probably some string manipulation could be done to see whether they are compatible. But as things stand, assertSorted has quite limited power.


Andrei

Reply via email to