World: r3wp
[Core] Discuss core issues
older newer | first last |
BrianH 10-Dec-2010 [710] | And not well enough documented either. I don't really know how /compare works, not completely. |
Steeve 10-Dec-2010 [711] | to sort gobs for instance, with your own scheme |
BrianH 10-Dec-2010 [712] | I know *why* it is there, I just don't know how it *works*. How does it react to different return types of the comparison function? What types are allowed? When is the security hole going to be fixed? |
Ladislav 10-Dec-2010 [713] | I know, that it is documented somewhere, that the Comparator can yield either logic! value or a number, where a negative number means "<", zero means "=", and a positive number means ">" |
Andreas 10-Dec-2010 [714] | Btw, Linux A110's SORT seems rather stable for me :) |
Ladislav 10-Dec-2010 [715] | using the example Brian gave? |
BrianH 10-Dec-2010 [716] | Read the ticket. "Stable" means a different thing when applied to sorting algorithms. |
Andreas 10-Dec-2010 [717] | Thanks Brian, I'm fine with terminology here. |
BrianH 10-Dec-2010 [718] | No offence intended :) |
Andreas 10-Dec-2010 [719x2] | I guess I wouldn't have told you about std::sort being unstable, if I wouldn't know what a stable sort is? |
Yes Ladislav, for all examples in that ticket. | |
BrianH 10-Dec-2010 [721] | Sorry, momentary lack of humor. Did you mean that it works correctly on Linux? |
Andreas 10-Dec-2010 [722] | Yes. |
BrianH 10-Dec-2010 [723x2] | If so, please mention that in a ticket comment. |
It might be a compiler problem. | |
Andreas 10-Dec-2010 [725] | A library problem, yes. |
BrianH 10-Dec-2010 [726] | Are you talking about R2 or R3? |
Andreas 10-Dec-2010 [727x2] | Read what I said above: A110 |
Two tests in the example code given in the ticket seem wrong to me. | |
BrianH 10-Dec-2010 [729] | Right, sorry. I read that after I sent the message. |
Andreas 10-Dec-2010 [730x3] | ; Verification using SAME? >> set [c d] sort reduce [a: "a" b: "a"] == ["a" "a"] >> same? c a == false ; should be true >> same? c b == true ; should be false >> same? d a == true ; should be true >> same? d b == false ; should be false |
The last two tests should be the other way round, no? | |
same? d a ; should be false same? d b ; should be true | |
BrianH 10-Dec-2010 [733] | Fixed. |
Andreas 10-Dec-2010 [734] | Thanks |
Steeve 10-Dec-2010 [735] | Btw, by reading again your samples Brian, I think now it"s weird for a quick sort. Not exactly what I expected.... |
Andreas 10-Dec-2010 [736] | At least on Linux, it definitely is a qsort. |
BrianH 10-Dec-2010 [737] | It might be using the C library qsort. |
Andreas 10-Dec-2010 [738] | Calling the C librabry's qsort(3). |
BrianH 10-Dec-2010 [739] | Definitely mention that in a ticket comment. We might be able to make this a platform-specific ticket. |
Andreas 10-Dec-2010 [740x2] | Not really, I fear. |
qsort(3) is not guaranteed to be stable. | |
BrianH 10-Dec-2010 [742] | I mean, mention that it works on Linux, if that is what your tests reveal. |
Andreas 10-Dec-2010 [743x2] | (Neither is it guaranteed to be a quicksort.) |
That it works on Linux is pure coincidence. | |
BrianH 10-Dec-2010 [745] | I ran into the problem when I was sorting words in a block and the bindings mattered. |
Andreas 10-Dec-2010 [746] | If we want SORT to be stable, the implementation will have to abandon the use of qsort(3). |
BrianH 10-Dec-2010 [747] | That would explain why the ticket is still not fixed. Please mention this in a ticket comment - it might lead to changing its status. |
Andreas 10-Dec-2010 [748x2] | You can of course hack stability into qsort() by falling back to comparing adresses if values are the same. |
Not sure if Carl likes that :) | |
BrianH 10-Dec-2010 [750x2] | That won't work, because we are comparing EQUAL? (maybe plus /case), not SAME?. |
Does qsort take a comparison function? If so, it might be a error in that function. | |
Andreas 10-Dec-2010 [752] | I'm talking about the C side of things here. |
BrianH 10-Dec-2010 [753] | Same here - a C function pointer. |
Andreas 10-Dec-2010 [754x4] | Then I don't understand your EQUAL?/SAME? remark. |
If two elements are EQUAL?, fall back to comparing their addresses in memory. | |
Won't work for linked lists, will work for arrays stored consecutively. | |
Sorry, missed that. Yes, qsort takes a callback used for comparison. Here's the decl: void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)); | |
BrianH 10-Dec-2010 [758] | Sorry, I just got that you were talking about using <= instead of <. |
Andreas 10-Dec-2010 [759] | My remark above was to the effect: if two elements are EQUAL? compare their INDEX? instead. This may sound ridiculous in context of REBOL's SORT, but it is no problem in C. |
older newer | first last |