Issue with block command 'NEXT'
[1/2] from: John_Dutcher:URMC:Rochester at: 2-Jul-2003 15:38
Hi,
The code fragment below shows promise for deleting a block from a
rebol style
database file. It finds the block within the database properly and
reports that
it removed it....it saves the file, and the expected block is gone
and the file
has compressed itself to close the gap perfectly. BUT....the next
iteration
of the 'For loop' fails to find a good series to look at, as
evidenced by the
error msg. also shown below (I let the loop continue in case there
are
additional blocks meeting the search criteria) ???
As a side item, I was puzzled that my originally coded 'remove pick
database i'
originally on line (5) didn't work (only removed first value in the
block)i, but
'remove next database i' seemed to remove entire block (as was
intended).
**********************************************************************
Code;
remove-data: func [lottery-name ticket-value] [
for i 1 length? database 1 [
if equal? first pick database i lottery-name [
if equal? second pick database i ticket-value [
remove next database i ;This may be working
by coincidence, just because it's the 2nd block ?
print [" "]
print ["Yes, the ticket: " lottery-name " "
ticket-value " was removed"]
save db-file database
] ;end if
] ;end if
] ;end for
] ;end func
***************************************************************************
Error:
>> remove-data lottery-name ticket-value
Yes, the ticket: UK Powerball 99 99 99 99 99 99 was removed
** Script Error: first expected series argument of type: series
pair event money date object port
time tuple any-function library struct event
** Where: do-body
** Near: if equal? first pick database
[2/2] from: brett:codeconscious at: 3-Jul-2003 11:06
When you remove something from a block, the block gets shorter. A FOR loop
is set for a specific number of iterations - in this case based on the
original length of the block. So at some point if you remove something your
loop will "fall off" the end - go past the tail.
Maybe you should change your code from using FOR to using WHILE.
Regards,
Brett.