www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 5124] New: Make std.algorithm.sort weakly pure

http://d.puremagic.com/issues/show_bug.cgi?id=5124

           Summary: Make std.algorithm.sort weakly pure
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: Phobos
        AssignedTo: nobody puremagic.com
        ReportedBy: bearophile_hugs eml.cc


--- Comment #0 from bearophile_hugs eml.cc 2010-10-26 17:20:57 PDT ---
A pure sort allows to sort data even in strongly pure functions, this will be
useful.

Using DMD 2.050beta I have modified a little many Phobos functions and now the
following testing code works:


import std.algorithm: sort;
import std.traits: FunctionAttribute, functionAttributes;

alias FunctionAttribute FA; // shorten the enum name

pure int[] foo1(int[] arr) {
    sort(arr);
    return arr;
}

pure int[] foo2(int[] arr) {
    sort!q{ a > b }(arr);
    return arr;
}

pure bool myComp1(int x, int y) { return x > y; }
pure int[] foo3(int[] arr) {
    sort!(myComp1)(arr);
    return arr;
}

pure int[] foo4(int[] arr) {
    static pure bool myComp2(int x, int y) { return x > y; }
    // static assert(functionAttributes!(myComp2) & FA.PURE); // asserts
    //sort!(myComp2)(arr);
    return arr;
}

void main() {
    assert(foo1([5, 1, 7, 4]) == [1, 4, 5, 7]);
    assert(foo2([5, 1, 7, 4]) == [7, 5, 4, 1]);
    assert(foo3([5, 1, 7, 4]) == [7, 5, 4, 1]);
    //assert(foo4([5, 1, 7, 4]) == [7, 5, 4, 1]);
}


To make it compile I have had to turn pure many functions and change few
things. Here are some of the changes:

-------------------

std.functional, line 179:

pure Body!(ElementType1, ElementType2).ReturnType

This is possible and safe because the functions defined as strings are always
static.

-------------------

A problem is in std.algorithm, an assert calls text() that may become pure, but
it will require some more work:

Commented out line 5167 of std.algorithm:

//assert(isSorted!lessFun(r), text(Range.stringof, ": ", r));

-------------------

Change the return type of std.range.assumeSorted, line 5405:

pure SortedRange!(R, pred) assumeSorted(alias pred = "a < b", R)(R r)

Note:
pure auto assumeSorted(alias pred = "a < b", R)(R r)

Can't be used because of bug 3934 (see also bug 5006 )

-------------------

SortedRange needs a pure this():

struct SortedRange(Range, alias pred = "a < b")
if(isRandomAccessRange!(Unqual!Range))
{
    alias Unqual!Range R;
    private R _input;

    pure this(R input)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 26 2010