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

World: r3wp

[Core] Discuss core issues

JaimeVargas
17-Jun-2005
[1279x2]
The problem I see is that it complicates debugging.

>> 1 + index? find "abc" "e"

** Script Error: index? expected series argument of type: series 
port
** Near: 1 + index? find "abc"

>> 1 + attempt[index? find "abc" "e"]
** Script Error: Cannot use add on none! value
** Near: 1 + attempt [index? find "abc" "e"]
So if INDEX? returns none the error of not finding the element propagates 
to the add function. In a longer expression the programmer will start 
debuging int the wrong place.
Volker
17-Jun-2005
[1281]
(thats what i wanted to say too. just wrong wording. should be "but 
<no-none> may be better for error-checking .."
Gabriele
17-Jun-2005
[1282x5]
compare:
1 + index? any [find "abc" "e" #]
to:
1 + any [index? find "abc" "e" 0]
maybe index? should directly return zero.
JaimeVargas
17-Jun-2005
[1287]
But then you need to have a test against zero in order to catch a 
not found result.
Volker
17-Jun-2005
[1288]
but when you found nothing, there is no index. 0 would give syntactically 
valid results, letting the rest of the program run. just doing wrong 
things. none will at least led to trapping it.

thinking about it, when using series instead of indices, it bails 
out on using, not immediate too. maybe index? pasing none is k.
JaimeVargas
17-Jun-2005
[1289]
The problem with returning zero is that is an attempt to handle implcitely 
something that should be explicit, that is error catching.
Ammon
17-Jun-2005
[1290]
I vote to leave it like it is.  It makes the most sense to have Index? 
fail on a non-series value.  I've found ANY to be a very handy function 
for handling things like that.  I initially just used it with EITHER 
and IF but its starting to show up in a lot of places in my code 
because it is just nice and concise. ;-)
Gabriele
17-Jun-2005
[1291x2]
is not finding a value an error? i think it isn't.
ammon: see above, if you use ANY you get 1 which is hardly what you 
want.
JaimeVargas
17-Jun-2005
[1293x2]
Not finding a value is not necesarily and error, that the reason 
find returns NONE. But it is an error to request the index of none.
Changing the semantics of INDEX? NONE is what is at stake.
Ammon
17-Jun-2005
[1295x2]
That is true but that just means that it may not be the way you want 
to handle it.  I think Ladislav is correct here.  In some situations 
it may not be bad to continue with a bad index value but I think 
the majority of the time then you need to cancel what you are doing 
if the index is not available, hence an error.
Jaime, Agreed!
Gabriele
18-Jun-2005
[1297x4]
Jaime: for INDEX? used alone, that may be true. But asking the position 
of a value in a series and asking the index of a value in a series 
are, IMHO, the same question.
pos: find series value
idx: index? find series value
so if the former should not cause an error, neither should the latter.
Volker
18-Jun-2005
[1301]
but then give 'none, not 0.
JaimeVargas
18-Jun-2005
[1302]
That sounds better. NONE = INDEX? NONE
Ammon
18-Jun-2005
[1303]
But then you run right back into the problem of having to check for 
a NONE value on the index variable because the code using it is undoubtedly 
going to fail on NONE because it is expecting a Number.  Any way 
you look at it you are going to end up needing to check for that 
NONE value.
BrianH
18-Jun-2005
[1304]
Checking for a none value is easy with the ANY native. It's just 
like using COALESCE in SQL.
Ammon
18-Jun-2005
[1305]
Yes, there are many ways to check for NONE and most of them are easy 
I'm just not sure how much value it would actually add to have Index? 
return NONE when passed a NONE value.
Volker
18-Jun-2005
[1306x3]
as gabriele says, we have the same problem with series. can be none 
too and fail then.
and Henrik likes better flow. i guess something like
 if index? find data value [ .. ]
or 
 any[ index? find data value  default ]
since i rarely use index when i can use series, i don't know how 
important thatis.
BrianH
18-Jun-2005
[1309]
The only time I've found it useful to use index is when using values 
in one series as a key to values in another series. Kind of rare 
when you have select/skip, but sometimes you don't want to modify 
the data series. All right, since RAMBO says that there are problems 
with select/skip right now, maybe not so rare.
Volker
18-Jun-2005
[1310]
IIRC that problems relate to select/skip on strings, which is not 
very common anyway.
BrianH
18-Jun-2005
[1311]
The reply said the bug applies to blocks too.
Volker
18-Jun-2005
[1312x3]
Using Select/Skip on a String! doesn't behave in a manner consistant 
with the way that it acts on a Block! which leads to a state where 
it freezes the REBOL Interpreter.
iOops, ok, i cant read.. yes, you are right.
(no freeze, but wrong result with blocks, ok, ok.. )
BrianH
18-Jun-2005
[1315x4]
For 8bit character strings I often prefer using a 256 byte binary 
lookup string indexed by the integer equivalent of the relevant character.
That doesn't work too well with Unicode though, unless you implement 
sparse lookup tables.
Still, what is the difference really between any [index? find data 
value 1 + length? data]  and  index? any [find data value tail data] 
 ?
The former being the version you could do if null handling were added 
to index?, the latter being the way you can do the same thing now.
Volker
18-Jun-2005
[1319x4]
that an error is not flagged in the second way.
the result is more or less valid. think you insert something in the 
block, then rebol will hapilly fetch at that index.
with none that does not happen. you can either keep is as none, or 
give it some value you really want. or you can use 'if and only act 
if found.
if ix: index? find data value [ print ix ]
instead of
   if pos: find data value[  ix: index? pos  print ix  ]
the first "flows" better.
BrianH
18-Jun-2005
[1323x2]
You misunderstand my point. Since Henrik was suggesting that  index? 
none  be changed to a non-erroneous condition to handle certain coding 
patterns, I was showing an example of such a pattern that can be 
accomplished with the existing index? behavior. The advantage to 
the existing index? behavior is that it forces you to deal with exceptional 
(but not erroneous) conditions closer to where they occur, and thus 
make your code easier to debug. I would write the second version 
of your example as  if pos: find data value [print index? pos]  which 
flows just as well as the first.
REBOL doesn't have lightweight exception handling like Icon - it's 
a lot easier track propagation of exceptional conditions by setting 
up the flow on purpose.
Volker
18-Jun-2005
[1325x2]
thats one way to see it, which i partly share.

but with series its the same kind of exception, and Gabriele argues 
we could deal with it like we do with series: give none and trap 
on access.

and the "flow" in such cases is to use the patterns i showed, with 
'if or 'any. and not forcing an extra assignment.
(or putting the "index? pos" somewhere in an expresion where it bloats 
and confuses a bit)
BrianH
18-Jun-2005
[1327x2]
Which of the other series functions also work on none, instead of 
just returning it?
I like the current behavior, because in my experience with null and 
unknown in SQL, tracking the cause of the unknown to its source can 
be tricky. It is easier to find out where that none came from if 
it doesn't propagate very far unintentionally. A meaningless none 
should be converted to a meaningful default while you can still tell 
where it came from.