r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Core] Discuss core issues

Gregg
7-Nov-2006
[6001]
Or maybe we can all learn what not to do if we try something similar.
Maxim
7-Nov-2006
[6002x3]
I can work around it (obviously).. but its just a core REBOL consistency 
issue.


its semantically unacceptable for a function called  to-INTEGER  
 to return anything else than an integer.  imagine if to-string decided 
to return words sometimes... its the same dangerous issue.
many places this can be a total fuck up
imagine this:

as-integer: func [value][
	any [
		attempt [to-integer value]
		0
	]
]


here we end up with a broken logic and impending doom...not of our 
fault.
so for now, we should all do this IMHO:

to-integer to-integer value
Ladislav
7-Nov-2006
[6005]
how could that help you?
Maxim
7-Nov-2006
[6006x2]
it raises the error overflow error.
the way to-integer is implemented right now it should be called
to-number
Gregg
7-Nov-2006
[6008x2]
to-integer is consistent as long as the value being given to it is 
within the bounds of 32-bit integer; outside that range, all bets 
are off. Your solution isn't going to help you, or catch other errors, 
e.g.:

>> to-integer to-integer "2147483646344.0"
== -1656
>> to-integer to-integer "2147483648343.0"
== 343
Only Carl can say why he designed it this way or, indeed, if it's 
intentional
Maxim
7-Nov-2006
[6010x2]
my god this horror is worse than I thought !
thanks for catching the 32 bit rollover
Gregg
7-Nov-2006
[6012]
I don't know if I'd call it "horror", though it's obviously not what 
some people will expect. It just means having to deal with those 
cases differently; use LOAD or TO DECIMAL! and check the range, etc.
Maxim
7-Nov-2006
[6013x3]
hehe  load also returns a decimal... I guess THAT is where the to-integer 
reaction is comming from deep inside.
but LOAD's reaction would be open to subjective debate.  to-integer 
cannot return anything else than an integer... it just makes no sense. 
 the primary goal of the function is to have as a return value a 
specific type.
AH HA!  I have a fix !
Gregg
7-Nov-2006
[6016]
Yeah, for that one, exact, string of ten characters, it's inconsistent.
Maxim
7-Nov-2006
[6017x2]
make integer! reacts as it should.
sourcing 'TO-INTEGER I see that its not using make.
Gregg
7-Nov-2006
[6019]
There you go then. :-) All the TO-* funcs are generated auotmatically 
I think.
Maxim
7-Nov-2006
[6020]
I just discoverd something quite interesting...  is it generally 
know that the issue datatype is inherently hexadecimal?
Gregg
7-Nov-2006
[6021]
Hmm, quick test; are you sure it does?
Maxim
7-Nov-2006
[6022]
>> to-integer #a
== 10
Gregg
7-Nov-2006
[6023]
Yes, that's known behavior; very handy.
Maxim
7-Nov-2006
[6024]
I guess its just the 'TO function
Gregg
7-Nov-2006
[6025]
MAKE does the same thing as TO here.
Maxim
7-Nov-2006
[6026x4]
'MAKE already accepts strings and decimals for creating integers... 
maybe to-integer should be redefined as:

to-integer: func [value][make integer! :value]
oooh this is much worse than I tought ! 

make integer!  "2147483648"
== 2147483648.0
but this crashes:

make integer!  2147483648.0
** Math Error: Math or number overflow
** Near: make integer! 2147483648.0
so ignore my 'MAKE suggestion... IT is the culprit, obviously.
Anton
7-Nov-2006
[6030]
I agree, some of the TO- datatype functions need to be tightened 
up.
Ladislav
8-Nov-2006
[6031x5]
thanks for finding this, guys, I will do my best to convince Carl 
to correct it
Max: in RAMBO you wrote: "Some string values will crash to-integer, 
some decimal values will crash make integer some don't. " - I suppose 
you meant "cause an error" instead of "crash"?
the problem is, that integer arithmetic looks inconsistent

 - some integer operations "overflow to decimals":

    to integer! "2147483648" ; == 2147483648.0  
    1 / 3 ; == 0.333333333333333
    log-10 1 ; == 0.0

- some operations "wrap":

    to integer! "2147483646344.0" ; == -1656
    abs -2147483648 ; == -2147483648

- some operations cause errors:

    1 + 2147483647
The consistency requrement looks natural, but I don't think that 
it is easy to be consistent "regardless of the cost". Discussion 
welcome.
...adding to the list of integer operation behaviours.

- some operations crash:

    -2147483648 // -1
Pekr
8-Nov-2006
[6036]
looking into that discussions, I wonder, if Rebol could be EVER considered 
to be used for the NASA purposes, as e.g. Python was used for some 
things.  Unless things are really predictable and without side effects, 
I am not sure it is.
Ladislav
8-Nov-2006
[6037]
I guess, that you are able to articulate your preferences too, so 
go ahead and speak. What are your preferred behaviours?
Henrik
8-Nov-2006
[6038]
well, predicable behaviors are preferred :-) Could there be performance 
hits if behavior is to be 100% consistent?
Ladislav
8-Nov-2006
[6039x2]
Of course, the "cheapest" is the wrapping behaviour.
in that case the integer division may be defined as in C
Henrik
8-Nov-2006
[6041]
the question is, would there not also be a performance hit if you 
need to check for wrapping inside your rebol code?
Pekr
8-Nov-2006
[6042]
Ladislav - dunno in that particular case. But I am just sensible 
enough to what others say. I reacted to the fact, that Rebol does 
have side effects. I don't know if it was Erlang or other functional 
language, where they claimed programmers like it, because of no side 
effects = predictable. But maybe it is just the case of documentation, 
but really - many novices just try in console by trial and error 
....
Ladislav
8-Nov-2006
[6043]
performance hit if you need to check for wrapping inside your ... 
code
 - that is exactly what every C programmer needs to do
Henrik
8-Nov-2006
[6044]
ladislav: yep, but isn't that faster to do in C than moving that 
check out into rebol code?
Ladislav
8-Nov-2006
[6045x5]
...and it is the highest performance solution, because you usually 
don't need to "check..."
especially when we take into account the fact, that integers will 
be 64-bit
so, performance-wisely speaking the fastest solution *is* wrapping, 
no doubt
OTOH, the safest solution is to either yield a meaningful value when 
appropriate, or cause an error
moreover, "yielding a meaningful value" is faster than "causing an 
error"
Maxim
8-Nov-2006
[6050]
but a meaningfull value is subjective.  what is meaningfull in one 
context can be your worst ennemy in another.