REXX Tips & Tricks, Version 2.80


Inf-HTML [About][Toc][Index] 0.9b (c) 1995 Peter Childs


EXPOSE does not work as expected




Problem:  You find that a variable used in the <EXPOSE statement of a 
          procedure is not visible in your routine. 
 
 Hint:  There's a bug in the processing of the EXPOSE statement in Classic 
        REXX (not in Object-Oriented REXX!): 
        If you expose a stem variable directly in the EXPOSE statement and 
        also in a variable list in parentheses the order of the parameter 
        for the EXPOSE statement is important. Try the example below to 
        see what I mean. 
        To avoid this bug, you should always specify variable lists before 
        variable names for EXPOSE statements 
        E.g. use 

         
           test: PROCEDURE expose (myVarList1) (myVarList2) myVar3 myVar4
        
        
        instead of 

         
           test: PROCEDURE expose  myVar3 myVar4 (myVarList1) (myVarList2)
        
        
        
        (see also The keyword instruction EXPOSE) 
 
 

  
 /* sample code to show the bug in the processing of the EXPOSE      */
 /* statement in Classic REXX                                        */
 
                     /* define some variable lists for the EXPOSE    */
                     /* statement                                    */
   exposeList = 'test1. test2. test3.'
   exposeList1 = 'test1. testVar test2. test3.'
 
                     /* define some variables for the EXPOSE         */
                     /* statement                                    */
   testVar = 'Testing...'
 
   test1.0 = 2
   test1.1 = 'T1_1'
   test1.2 = 'T1_2'
 
   test2.0 = 2
   test2.1 = 'T2_1'
   test2.2 = 'T2_2'
 
   test3.0 = 2
   test3.1 = 'T3_1'
   test3.2 = 'T3_2'
 
                     /* show the values of the variables in the main */
                     /* procedure                                    */
   say 'Now in Main:'
   call ShowVariables
 
                     /* now call the various subroutines with        */
                     /* different EXPOSE statements.                 */
                     /* Note that all global variables should be     */
                     /* available in all subroutines!                */
   call TestProc1
   call TestProc2
   call TestProc3
   call TestProc4
 
 return
 
 TestProc1: PROCEDURE expose (exposeList) test2. test1. testVar
   say 'Now in TESTPROC1: PROCEDURE expose (exposeList) test2. test1. testVar'
   call ShowVariables
 return
 
 TestProc2: PROCEDURE expose test1. (exposeList)  TestVar
   say 'Now in TESTPROC2: PROCEDURE expose test1. (exposeList) TestVar'
   call ShowVariables
 return
 
 TestProc3: PROCEDURE expose test2. (exposeList1)
   say 'Now in TESTPROC3: PROCEDURE expose test2. (exposeList1) '
   call ShowVariables
 return
 
 TestProc4: PROCEDURE expose test1. (exposeList1)
   say 'Now in TESTPROC4: PROCEDURE expose test1. (exposeList1) test2. TestVar'
   call ShowVariables
 return
 
 /* sample routine to show the value of all global variables         */
 ShowVariables:
   if datatype( test1.0 ) = 'NUM' then
   do
     do i = 0 to test1.0
       call CharOut, 'test1.' || i || ' is "' || test1.i || '" '
     end
     say
   end
   else
     say 'test1.0 is "' || test1.0 || '" (= NOT DEFINED!!!)'
 
   if datatype( test2.0 ) = 'NUM' then
   do
     do i = 0 to test2.0
       call CharOut, 'test2.' || i || ' is "' || test2.i || '" '
     end
     say
   end
   else
     say 'test2.0 is "' || test2.0 || '" (= NOT DEFINED!!!)'
 
   if datatype( test3.0 ) = 'NUM' then
   do
     do i = 0 to test3.0
       call CharOut, 'test3.' || i || ' is "' || test3.i || '" '
     end
     say
   end
   else
     say 'test3.0 is "' || test3.0 || '" (= NOT DEFINED!!!)'
 
   say 'TestVar is "' || testVar || '"'
 return
 
 
 
 Here is the result from the code above executed under Classic REXX:   

  
 Now in Main:
 test1.0 is "2" test1.1 is "T1_1" test1.2 is "T1_2"
 test2.0 is "2" test2.1 is "T2_1" test2.2 is "T2_2"
 test3.0 is "2" test3.1 is "T3_1" test3.2 is "T3_2"
 TestVar is "Testing..."
 Now in TESTPROC1: PROCEDURE expose (exposeList) test2. test1. testVar
 test1.0 is "2" test1.1 is "T1_1" test1.2 is "T1_2"
 test2.0 is "2" test2.1 is "T2_1" test2.2 is "T2_2"
 test3.0 is "2" test3.1 is "T3_1" test3.2 is "T3_2"
 TestVar is "Testing..."
 Now in TESTPROC2: PROCEDURE expose test1. (exposeList) TestVar
 test1.0 is "2" test1.1 is "T1_1" test1.2 is "T1_2"
 test2.0 is "TEST2.0" (= NOT DEFINED!!!)
 test3.0 is "TEST3.0" (= NOT DEFINED!!!)
 TestVar is "Testing..."
 Now in TESTPROC3: PROCEDURE expose test2. (exposeList1)
 test1.0 is "2" test1.1 is "T1_1" test1.2 is "T1_2"
 test2.0 is "2" test2.1 is "T2_1" test2.2 is "T2_2"
 test3.0 is "TEST3.0" (= NOT DEFINED!!!)
 TestVar is "Testing..."
 Now in TESTPROC4: PROCEDURE expose test1. (exposeList1) test2. TestVar
 test1.0 is "2" test1.1 is "T1_1" test1.2 is "T1_2"
 test2.0 is "TEST2.0" (= NOT DEFINED!!!)
 test3.0 is "TEST3.0" (= NOT DEFINED!!!)
 TestVar is "TESTVAR"
 
 
     

Inf-HTML End Run - Successful