=====Simulating RESUME and RESUME NEXT===== //by Richard Russell, September 2007//\\ \\ BBC BASIC doesn't have the **RESUME** and **RESUME NEXT** statements sometimes found in other dialects of BASIC. Although there are alternative (and probably better) ways of achieving a similar effect when writing a program from scratch, their absence can be inconvenient when translating programs from another dialect. This article describes how a very similar effect can be achieved in //BBC BASIC for Windows// (version 5.60a or later).\\ \\ Firstly let's review what RESUME and RESUME NEXT do. They are intended for use in an error handler (i.e. a routine activated by **ON ERROR**) and cause execution to continue at the statement that resulted in the error (in the case of **RESUME**) or the statement following the one that resulted in the error (in the case of **RESUME NEXT**).\\ \\ Here is a simple **GW-BASIC** or **QBASIC** program which illustrates the use of RESUME (//don't// try to run it in **BBC BASIC**!):\\ \\ PRINT "Program starting" ON ERROR GOTO 1000 Divisor = 0 PRINT "Attempting division..." PRINT 10 / Divisor PRINT "Program finished" END 1000 PRINT "Error: "; ERR Divisor = 3 RESUME When run the program generates the following output:\\ \\ Program starting Attempting division... Error: 11 3.333333 Program finished Note that an error occurs (division by zero) because **Divisor** is initially zero, but in the error handler **Divisor** is changed to 3 and the division is repeated, this time successfully.\\ \\ Here is the same program in //BBC BASIC for Windows// using some sneaky code to reproduce the effect of **RESUME**:\\ \\ PRINT "Program starting" ON ERROR GOTO 1000 Divisor = 0 PRINT "Attempting division..." PRINT 10 / Divisor PRINT "Program finished" END 1000 PRINT "Error: "; ERR Divisor = 3 REM RESUME P% = PAGE WHILE ?P% AND P% + ?P% < !408 P% += ?P% : ENDWHILE GOTO (P%) This code produces the following output:\\ \\ Program starting Attempting division... Error: 18 3.33333333 Program finished Note that it has correctly re-executed the division statement but //not// the preceding "PRINT" statements.\\ \\ If we change the **QBASIC** program to use **RESUME NEXT** instead of **RESUME** this is the output we get:\\ \\ Program starting Attempting division... Error: 11 Program finished Here the division isn't repeated, and the RESUME NEXT transfers control to the "PRINT "Program finished"" line.\\ \\ Here is the equivalent program in //BBC BASIC for Windows//:\\ \\ PRINT "Program starting" ON ERROR GOTO 1000 Divisor = 0 PRINT "Attempting division..." PRINT 10 / Divisor PRINT "Program finished" END 1000 PRINT "Error: "; ERR Divisor = 3 REM RESUME NEXT P% = PAGE REPEAT P% += ?P% : UNTIL ?P% = 0 OR P% > !408 GOTO (P%) And here is the output:\\ \\ Program starting Attempting division... Error: 18 Program finished There are a couple of respects in which the code replacements shown here don't work exactly the same as the traditional RESUME and RESUME NEXT statements:\\ \\ - The BBC BASIC code transfers control to the **line** which caused the error or the following **line**, //not// to the statement causing the error and the following statement. Therefore it may not behave as required if there is more than one statement on a line. - If the error trapping occurs in a function, procedure or loop, **ON ERROR LOCAL** must be used to avoid the stack being cleared down. \\ The code listed in this article requires //BBC BASIC for Windows// version 5.60a or later, and relies on undocumented behaviour which is not guaranteed to remain compatible in future versions. However it does work correctly with version 5.70a.