World: r3wp
[Core] Discuss core issues
older newer | first last |
BrianH 28-May-2011 [1536x2] | The modulus operation from math is not defined for negative numbers at all. Most programming languages with a modulus operation have extended it to cover negative numbers, but there is no agreed definition for it. This is why *all* programming languages and math processors that have modulus of negative numbers defined, are using an arbitrary platform-dependent definition for it, *even Wolfram Alpha*. |
The "correct answer" is NaN or to trigger an error, but since that is not useful, to pick a definition that is useful. | |
Henrik 28-May-2011 [1538x3] | >> lesser? 'a 6 == false >> lesser? 6 'a ** Script Error: Expected one of: integer! - not: word! ** Near: lesser? 6 'a |
how does SORT do it without errors? | |
(the lesser? is from a sort/compare) | |
Ladislav 28-May-2011 [1541] | The correct answer is -2. - that is false, you need to read the help string |
Geomol 28-May-2011 [1542] | From HELP MOD: "Compute a nonnegative remainder of A divided by B." MOD can produce negative results as seen above. From HELP MODULO: "Wrapper for MOD that handles errors like REMAINDER." So REMAINDER must give wrong result in some cases. What does REMAINDER say: From HELP REMAINDER: "Returns the remainder of first value divided by second." That's what I expect a modulo operation to do. A modern definition is given by Knuth in "The Art of Computer Programming" using floored division, and this seems to be also the definition, Wolfram Alpha use. So I would say, REMAINDER give the correct answer in the second case, but not in the first. As I see it, REBOL have 3 modulo functions, and none of them operate as expected, if Knuth's definition is used. |
onetom 28-May-2011 [1543] | would be nice if such discussion could be looked up when someone is curious why something has been implemented in a certain way... the rebol3 blog is a kind of raw material for such a "background documentation"... |
Ladislav 28-May-2011 [1544x2] | none uses Knuths definition |
BTW, this was discussed and implemented in ALtMe some time ago | |
Geomol 29-May-2011 [1546] | none uses Knuths definition Ladislav, please! Check mod in these languages: Clojure, Common Lisp, Filemaker, Fortran (modulo), Lua, Mathematica, MATLAB, R, Ruby (remainder), Scheme (modulo), Smalltalk (\\), VHDL and maybe a few more. They all give the same result as from Knuth definition. |
Ladislav 29-May-2011 [1547x3] | none uses Knuths definition - you should try to comprehend. None of the functions you mentioned uses the Knuths definition. |
In case you again try to misunderstand, then it is "none of the Rebol functions you mention" | |
And, moreover, you can easily redefine the MOD and MODULO, since they are mezzanines | |
onetom 29-May-2011 [1550x2] | Ladislav: I misunderstood it too as "no fucking body is using knuths definition" |
s/is using/uses/ | |
Ladislav 29-May-2011 [1552] | come on. If a function does not use a definition, then you cannot claim the function has a bug when differing from the definition in question. |
Geomol 29-May-2011 [1553] | Oh, sorry. None of the REBOL functions use Knuth's definition. Got it. :) |
Ladislav 29-May-2011 [1554x3] | Due to specifics in REBOL arithmetic it was deemed desirable to remain compatible with some of them when defining more arithmetic functions |
In essence, the MOD function is a "helper" for ROUND. It uses the Boute's definition, but assuming that the divisor is positive. If you do want to use a more comfortable variant, you can use the MODULO function, which does not make such an assumption. | |
Still, there are arithmetic specifics, regarding rounding. | |
PeterWood 30-May-2011 [1557] | A bug? >> cur: what-dir == %/Users/peter/ >> cd %Code/Rebol == %/Users/peter/Code/Rebol/ >> cd cur ** Access Error: Cannot open /Users/peter/Code/Rebol/cur/ ** Near: change-dir to-file path >> change-dir cur == %/Users/peter/ Though this works: >> cd :cur == %/Users/peter/ |
Geomol 30-May-2011 [1558x4] | >> ? cd USAGE: CD 'dir Notice the non-evaluated Literal Argument. So when you use CD, the argument isn't looked up. >> ? change-dir USAGE: CHANGE-DIR dir With CHANGE-DIR, it is looked up. It is expected behaviour, but maybe confusing, that CD and CHANGE-DIR are different. |
If I remember correctly, CHANGE-DIR came first, and it's suited for being used in scripts. CD is suited for using at the prompt. | |
<tab> completion of directories and files works, if you give argument as a file! datatype, but not when giving word! argument for CD. I believe, this is hard to get by. | |
And then, maybe if CD were constructed like this: cd: func [ 'dir [file!] ][ ... ] | |
Henrik 2-Jun-2011 [1562] | What does the PATH function do? |
Geomol 2-Jun-2011 [1563x2] | >> blk: [a b c] == [a b c] >> path blk 'a >> blk == [a] >> blk: [a b c] == [a b c] >> path blk 'b >> blk == [a b] >> blk: [a b c] == [a b c] >> path blk 'c ** Script Error: Invalid path value: c Maybe for some internal use? |
From group Core-old: A: the PATH action is what the interpreter uses to evaluate VALUE/selector expressions for each datatype. It is an internal action and has no external purpose in programs. These kinds of words often appear as a sort of side-effect" from how REBOL is structured. Datatypes are implemented as a sort of object class, where the interpreter "sends messages" to the class to evaluate expressions. The PATH action is a message that tells the datatype to perform a pick-like or poke-like internal function." | |
Henrik 2-Jun-2011 [1565] | interesting, thanks |
Geomol 2-Jun-2011 [1566] | It seems to original come from a post in group "RT Q&A" dated 11-Dec-05. |
Gabriele 3-Jun-2011 [1567] | yep, that's supposed to be unset but it somehow has been leaking out for a while. |
Henrik 4-Jun-2011 [1568x3] | is there any official way of using SORT/COMPARE on a block containing a mix of different datatypes? |
or perhaps more correctly, a method to use LESSER? or GREATER? on a mix of different datatypes? | |
Looks like SORT uses this datatype map internally: [unset! datatype! native! action! function! object! word! set-word! get-word! lit-word! refinement! none! logic! integer! decimal! money! time! date! char! pair! event! tuple! bitset! string! issue! binary! file! email! url! tag! image! block! paren! path! get-path! set-path! lit-path! hash! list!] | |
onetom 4-Jun-2011 [1571] | how do u know? |
Henrik 4-Jun-2011 [1572x3] | I made a block of all datatypes and sorted it. That was the outcome. |
Nevertheless, it seems the method is going to be complicated and slow for /COMPARE as I don't know how it handles periferal cases like: sort reduce [true false] == [false true] which cannot be compared outside SORT using: lesser? true false ** Script Error: Cannot use lesser? on logic! value and I don't know and should not need to know how many periferal cases there are. | |
the solution to me would be that comparison functions use the same logic as SORT. | |
Geomol 4-Jun-2011 [1575x4] | Since you can sort a block of logic! values, then <, > etc. should work on them, so that's missing. Doing to-integer on logics first solve it. And you have to check all the other datatypes by hand first to find out, where possible problems are, I guess. |
Sorting pairs. hmm... >> sort [1x2 2x1] == [2x1 1x2] Doesn't make sense. | |
It shouldn't be possible to order pairs, like complex numbers. (Unless you define your own rules.) :) | |
But as pairs are used to make GUIs, it maybe makes sense to sort them in this case. Top of screen is before bottom. | |
Henrik 4-Jun-2011 [1579] | SORT seems to sort anything that you throw at it and I think that makes sense, when making GUI lists. Right now I have a problem in that I can't control the input datatype and must sort anyway. The structure of the data is currently so that SORT/COMPARE is best to use, but LESSER? and GREATER? prevent this from being simple. |
Geomol 4-Jun-2011 [1580] | Today's Moment of REBOL Zen: >> forever [prin now/time // 7 wait 1 loop 20 [prin bs]] 0:00:00.000000002 |
Gregg 4-Jun-2011 [1581] | Very cool John. |
onetom 5-Jun-2011 [1582] | :)) i didn't know about bs until now... |
Gabriele 5-Jun-2011 [1583] | forever [prin now/time // 7 wait 1 prin cr] (remainder on time is funny) |
Geomol 5-Jun-2011 [1584x2] | Yeah, looks like a bug. |
onetom: >> ? char! Found these words: backslash char! #"\" backspace char! #"^H" bs char! #"^H" cr char! #"^M" escape char! #"^[" lf char! #"^/" newline char! #"^/" newpage char! #"^L" null char! #"^@" slash char! #"/" tab char! #"^-" | |
older newer | first last |