In addition to simple strings, the Rexx class supports traditional arrays with a numeric index in square brackets. Of course, NetRexx arrays may be multidimensional. It is not necessary to reserve storage -- simply assign elements as needed.
An even more interesting feature of the Rexx class is the indexed string, which is similar to a traditional array, but for which the indexes are literal strings rather than numbers (like a Java HashTable). Thus, you might populate an indexed string simply by assigning elements:
method LoadList NameList = ' ' NameList['mickey'] = 'ClubLeader' NameList['minnie'] = 'mouseketeer' NameList['donald'] = 'aDuck'
Indexed strings also behave like arrays in that one may execute a series of instructions on all elements by looping over the indexes. The loop instruction in Example 2(a) does just this.
Example 2: Two equivalent pieces of code.
During each iteration of the loop, the variable thisname takes on the value of the next index. For arrays with numeric indexes, the indexes are processed in numerical order. For indexed strings, the order of selection cannot be predicted.
Because Rexx variables are strings and humans generally perceive even significant portions of program execution in terms of strings, NetRexx includes string manipulation methods. Most of the popular built-in string manipulation functions from Rexx are available as NetRexx methods.
There is also an exists method to determine if a particular index to an indexed string exists. Using this method, Example 2(a) can be simplified to Example 2(b).
From NetRexx to Java and Back Again
NetRexx uses the Java object model, so Java classes may be invoked directly from NetRexx just as if they were NetRexx classes. The converse is also true.
Listing One is a web-based registration form that must be completed for access to information from the server. (Listing Two displays the applet Registry.)
Listing Two
<html><body bgcolor="#ffffff"> <p> This sample Web page displays the applet Registry. <p> The applet appears centered in the browser window just below this text. <p> <br> <center> <applet code="Registry.class" width=500 height=150> </applet> </center> <p> <br> <font size=2> Last modified: 30 April 1997 </font> </body> </html>
Listing One includes many examples of how you can use Java classes directly:
- It constructs new Java buttons with
bclear = Button("Clear"). - It instantiates editable text fields with
name = TextField(15). - It creates new Panels with
p1 = Panel().
NetRexx does not need a keyword such as new to reserve storage for new instances of objects. Nor do you need to explicitly type cast the variable. NetRexx's stat=Panel() is functionally equivalent to Java's Panel stat=new Panel().
NetRexx's evaluation of compound terms from left to right is consistent with Java syntax. Invoking Java methods uses the same syntax as invoking NetRexx methods; and our sample is full of examples of using Java methods directly -- in the layout, color-scheme definition, and population of the applet's window and in retrieving (or clearing) user input.
Operators
NetRexx provides all the usual assignment, arithmetic, logical, and comparison operators but includes extensions as well. The "equals" sign (=) assignment operator may also be used to assign a type to a variable, as illustrated by statlbl = Label or NameList = Rexx. This devolves naturally from the search order for evaluating a term.
A unique operator is blank concatenation, in which a single blank between two terms concatenates their values with a blank in between: say 'Username:' uname yields Username: pjt when the value assigned to uname is "pjt."
NetRexx also uses the blank operator for typecasting as illustrated by u = Rexx name.getText (at the beginning of the Register method) where the value of name.getText is cast to type Rexx.
Methods Without Madness
NetRexx's method instruction fully supports the concept of a "method signature" as in other languages such as Java. A NetRexx method may also be defined with no signature, in which case it accepts no arguments, and any value it may return is of type Rexx. The LoadList and Register methods in our sample share these characteristics.
In the clause if Register then Status("RegOK"), the value returned from Register is treated as a Boolean. NetRexx automatically recognizes 0 and 1 (the possible return values) from Register as Booleans if the context requires, so explicit definition of the return type from Register is unnecessary. You may wish to do so for clarity, however, as in the Valid method.
Argument lists are supplied as a list of variables within parentheses immediately adjacent to the method name as illustrated by the action and Status methods. For the action method shown in Example 1, the argument types are explicitly declared. The Status method shown in Example 3 illustrates the use of optional arguments for which a default value is supplied and, in this case, the default type is Rexx. Both required and optional arguments may be specified, with the optional ones omitted from the right.
Example 3: The Status method.
Though they are not discussed here, other keywords are available to further qualify a NetRexx method.
Also of Interest
NetRexx supports two styles of comments. Block comments are delimited by pairs of /* and */ and may be nested. The --delimiter begins a line comment which is terminated by the line end.
Unlike Java, NetRexx is generally case-insensitive. This gives you the flexibility to use the capitalization style you prefer. Furthermore, normal comparison operators perform case-insensitive comparisons, freeing you from the problem of case in such operations as comparing user input to expected inputs or specifying method argument strings. In the Register method, the call Status("NOUSER") specifies an uppercase argument, but the Status method compares it to the mixed-case "NoUser." When case sensitivity is important, the strict comparison operators == and \== can be used.
The select construct (used in both the action method and the Status method) is the NetRexx equivalent of a case statement.
The action method (to handle button actions) is present because this sample was implemented for use with JDK 1.02. For JDK 1.1, this would be replaced with appropriate event listeners.
Conclusion
In the real world, the NameList would be populated from a file or database resident on the server rather than by the LoadList method. You might use Java classes for this, or you could use the NetRexx RXFile suite developed by Max Marsiglietti, which is accessible through the NetRexx home page.
The actual call to the server to load a restricted URL is commented out in my sample in favor of simply displaying a label that announces a successful connection. Reverse the commenting (and provide an appropriate URL, of course) to make this a live web application.
Pamela is Rexx/Java project manager for the Share Technology Conference, vice-chairman of NCITS Committee J18 for the Rexx Language, and is on the board of directors of the Rexx Language Association. She can be reached at pamela_taylor@ stercomm.com.


