Rexx Programming/How to Rexx/goto

From Wikibooks, open books for an open world
Jump to navigation Jump to search

Many languages have a "jump" instruction or a "goto statement" that skips to an arbitrary part of the program. Other languages completely replace the need for such a statement with more specific flow control constructs. Rexx mostly uses subroutines and DO/END blocks to jump around to different parts of the program, but it does have a more general kind of jump instruction. You can use the SIGNAL keyword to redirect the computer to a labeled location in the program. Labels end in a colon.

/* Jump around to validate input and factor a whole number. */
START:
 say "I can factor a positive whole number for you."
 say "First, enter a number of your choice:"
 signal GET_NUMBER
START_FACTORING:
 say "Here are the factors of" number":"
 possible_factor = 1
CHECK_FACTOR:
 if number // possible_factor = 0 then signal SHOW_FACTOR
 else signal NEXT_FACTOR
SHOW_FACTOR:
 say possible_factor
NEXT_FACTOR:
 possible_factor = possible_factor + 1
 if possible_factor > number then signal FINISHED
 signal CHECK_FACTOR
FINISHED:
 say "That's all!"
 exit
GET_NUMBER:
 pull number
CHECK_NUMBER:
 if DataType(number, "W") then signal POSITIVE?
 say "That's not even a whole number."
 signal GET_NUMBER
POSITIVE?:
 if number > 1 then signal START_FACTORING
 say "Positive, please!"
 signal GET_NUMBER

Long programs that depend on goto statements are notoriously difficult to understand in the long term. Stick with the structured control flow statements described elsewhere in this book, such as for loops. A more elegant way to write this script, without SIGNAL statements, might be as follows:

/* Greet the user and ask for a positive whole number. */
say "I can factor a positive whole number for you!"
say "First, enter a number of your choice:"
/* Make sure the user actually enters a positive whole number. */
do until whole? & positive?
 pull number
 whole? = DataType(number, "W")
 positive? = number > 0
 if \ whole? then say "That's not even a number!"
 else if \ positive? then say "Positive, please!"
end
/* Now show the factors */
say "Here are the factors of" number":"
do possible_factor = 1 to number
 if number // possible_factor = 0 then
  say possible_factor
end
say "That's all!"
exit