enforce()?

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sat Jul 17 13:25:16 PDT 2010


On 06/16/2010 05:47 AM, Steven Schveighoffer wrote:
> On Tue, 15 Jun 2010 22:23:15 -0400, Andrei Alexandrescu
> <SeeWebsiteForEmail at erdani.org> 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


More information about the Digitalmars-d mailing list