The GLOBAL command declares that its arguments are global. That means that its arguments, which are the names of constant or variable vectors, will be accessible directly by name within subroutines (see NEWCMD) without having to be passed through the subroutine's argument list. String variables (which are created by the STRING command) and arrays (which are created by the NEWARRAY command) may also be declared GLOBAL. Examples of the GLOBAL command's syntax: NAME (1 2 3 4) clubs spades hearts diamonds GLOBAL clubs spades hearts diamonds or, NAME (1 2 3 4) clubs spades hearts diamonds GLOBAL clubs GLOBAL spades GLOBAL hearts GLOBAL diamonds By default, variables and constants declared in the main program, outside a subroutine, are not visible within subroutines. As a result, references inside a subroutine to an outside variable or constant will produce an error message. The GLOBAL command overrides the default behavior for those constants and variables that it lists, making them available by name inside subroutines. The best way to use the GLOBAL command is to declare only those constants (created with the NAME command) to be global that need to be shared with a subroutine. This makes those constants available to all subsequent subroutines throughout the program and does not cause any "side effects". A side effect of a subroutine is a change to some variable outside the subroutine that is not listed in the subroutine's argument list. A side effect will be introduced if you declare a variable to be GLOBAL and then change its value in a subroutine. Good programming practice suggests eliminating or minimizing side effects. If you are not using subroutines, then you don't need to use the GLOBAL command. If you are using subroutines, try to use GLOBAL only for NAMEd constants and pass any variables via the subroutine's argument list. General points about the GLOBAL command:
Once an array has been declared by a NEWARRAY command, it can be made GLOBAL by using the array name, without indexes, in a GLOBAL command, like this: GLOBAL myArray The entire array is either global or not global. You cannot declare an individual array entry (such as myArray[3]) to be global. |
Here's a simple example of a subroutine that computes the log base 10 of a vector. Compare this to the similar example at NEWCMD. NAME 2.772588722239781 log16 'log base e of 16 GLOBAL log16 'Subroutine to compute log base 16 NEWCMD log16 input result LOG input logInput ' log base e of input DIVIDE logInput log16 result END 'Main program using the subroutine COPY 1,16 A LOG16 A log16A PRINT A log16A Here's a more elaborate example: /* From "Fifty Challenging Problems in Probability" by Frederick Mosteller "To encourage Elmer's promising tennis career, his father offers him a prize if he wins (at least) two tennis sets in a row in a three-set series to be played with his father and the club champion alternately: father-champion-father or champion-father-champion, according to Elmer's choice. The champion is a better player than Elmer's father. Which series should Elmer choose?" */ '(Call the champion "pro".) 'Assign arbitrary probabilities to the pro and the father vs. the son, 'with the restriction that the pro's probability of winning is 'higher than the father's. Create two universes based on those 'probabilities, one for the pro vs. the son and one for the 'father vs. the son. NAME sonLoses sonWins GLOBAL sonLoses sonWins COPY 7#sonLoses 3#sonWins proGames 'p = 0.7 (pro has higher prob than father) COPY 6#sonLoses 4#sonWins fatherGames 'p = 0.6 'Subroutine to determine and score the results of 'a three-set tournament. NEWCMD tournament firstGame secondGame thirdGame successCount IF firstGame = sonWins IF secondGame = sonWins ADD 1 successCount successCount END ELSEIF secondGame = sonWins IF thirdGame = sonWins ADD 1 successCount successCount END END END 'Main program NAME 10000 rptCount COPY 0 successCount 'Compute probability of set with father in middle REPEAT rptCount SAMPLE 1 proGames firstGame SAMPLE 1 fatherGames secondGame SAMPLE 1 proGames thirdGame TOURNAMENT firstGame secondGame thirdGame successCount END DIVIDE successCount rptCount probFatherMiddle PRINT probFatherMiddle 'Compute probability of set with pro in middle COPY 0 successCount REPEAT rptCount SAMPLE 1 fatherGames firstGame SAMPLE 1 proGames secondGame SAMPLE 1 fatherGames thirdGame TOURNAMENT firstGame secondGame thirdGame successCount END DIVIDE successCount rptCount probProMiddle PRINT probProMiddle |