Commodore‎ > ‎BASIC‎ > ‎Keywords‎ > ‎

BEGIN

Keyword Abbreviation Token (hex) Version(s) Classification
BEGIN B{Shift+E} FE 18 7.0 Preposition

  Syntax  
IF condition GOTO lineNumTrue THEN [ lineNumTrue | BEGIN ] } [ statementT ] [ : statementT ]...
[ statementT : ] ... BEND junk1 ] [ : ELSE lineNumFalse BEGIN ] [ statementF ] [ : statementF ] ...
[ statementF : ] ... BEND junk2 ] ]
 
Parameters Type Legal Value(s) Default Value Note(s)
condition Boolean   all numeric  
lineNumTrue
Unsigned integer
0 ~ 63999
Must be a literal number
Branched to when condition is true (not 0)
statementT
Command or Statement all*
Must be valid in current direct/RUN mode
Executed when condition is true (not 0)
junk1
Literal character(s)
any but colon (:)
ignored; similar to DATA
lineNumFalse
Unsigned integer
0 ~ 63999
Only valid in v3.5, 4.7, and 7.0
Must be a literal number.
Branched to when condition is false (0)
statementF
Command or Statement
all*  
Only valid in v3.5, 4.7, and 7.0
Must be valid in current direct/RUN mode
Executed when condition is false (0)
junk2
Literal character(s)
all
ignored; just like REM

 
  Purpose  
Program formatting.  Allow conditional clause(s) to span multiple program lines.

 
  Remarks  
Although the syntax shown above is rather complex, BEGIN is very simple.  It may appear immediately after THEN or ELSE keywords (or both) to allow the conditional statements to span multiple lines.  Without BEGIN/BEND, the entire IF/THEN/ELSE construct must fit on a single line.  So BEGIN is in someways similar to GOSUB which executes a seperate block of statments (however BEGIN doesn't normally use the stack).  Also similar to GOSUB/RETURN is the fact that if you include BEGIN, you should also include BEND; otherwise you will generate a BEND NOT FOUND ERROR when the opposite case is selected.
 
In BASIC versions prior to 7.0 (i.e., without BEGIN/BEND), there were two or three alternatives:
  1. use GOTO statements to branch over the "wrong" case,
  2. or use GOSUB to call a block of statments,
  3. or a combination of the two.
Like most prepositions, attempting to use BEGIN as a command or statement (i.e., not following THEN/ELSE) will generate a SYNTAX ERROR.
 
The first statement following BEGIN (or lineNumTrue, lineNumFalse, ELSE or THEN), if any, does not need a leading colon (:). This makes typing programs a bit easier and saves a byte; however, many BASIC extensions will fail if a leading colon is not present. It seems this is a hack written by Microsoft in the original version of BASIC. It essentially short-circuits the normal BASIC execution logic, with some ugly side-effects. Besides causing trouble for BASIC extensions, HELP will highlight the entire IF / THEN / ELSE construct when the error occured in the BEGIN clause; similarly error trapping is messed up; the hacked implementation also delays execution of a COLLISION routine.
 
BEGIN/BEND allows real nesting of IF/THEN/ELSE statments (it is broken otherwise, see ELSE).  Beware that BASIC does not impose any limits on the depth of nesting which can cause the system to mysteriously crash.  In detail, when BEGIN is found while BEND is being sought, BASIC will recursively call "find BEND" which uses 2 bytes of the CPU stack but no test is ever made to see if space is available on the CPU stack.
 
* The selected command/statement must be valid for the current Interpreter mode (Direct Mode or Run Mode, per the current state of the BASIC Interpreter).
  
Example 1:
NEW
10 X=1 : IF X=1 THEN BEGIN
20 : PRINT "TRUE" : X = 2 : BEND : ELSE PRINT "FALSE" : X = 0
30 PRINT X
RUN
TRUE
 2

READY.
NEW : REM demonstrate 'safe' omission of BEND (line 20)

READY.
10 X=1 : IF X=1 THEN BEGIN
20 : PRINT "TRUE" : X = 2 : ELSE PRINT "FALSE" : X = 0
30 PRINT X
RUN
TRUE
 2

READY.
NEW : REM demonstrate 'bad' omission of BEND (line 20)

READY.
10 X=99 : IF X=1 THEN BEGIN
20 : PRINT "TRUE" : X = 2 : ELSE PRINT "FALSE" : X = 0
30 PRINT X
RUN

?BEND NOT FOUND ERROR IN 30
READY.
  
Example 2 is for BASIC v1.0 and v2.x which lack ELSE and BEGIN/BEND:
NEW

READY.
10 X=1 : IF X=1 THEN PRINT "TRUE" : X=2 : GOTO 30 :REM THEN clause + GOTO to skip ELSE clause
20 PRINT "FALSE" : X = 0 : REM the ELSE clause
30 PRINT X
RUN
TRUE
 2

READY.
NEW

READY.
10 X=1 : IF X=1 THEN GOSUB 100 : GOTO 30 :REM call THEN clause + Skip ELSE clause
20 PRINT "FALSE" : X = 0 : REM the ELSE clause
30 PRINT X : END
100 PRINT "TRUE" : X=2 : RETURN
RUN
TRUE
 2

READY.
 
  See Also  
 
  Compare With  

© H2Obsession, 2014
Comments