Dr. Dobb's is part of the Informa Tech Division of Informa PLC

This site is operated by a business or businesses owned by Informa PLC and all copyright resides with them. Informa PLC's registered office is 5 Howick Place, London SW1P 1WG. Registered in England and Wales. Number 8860726.


Channels ▼
RSS

JVM Languages

Using NetRexx


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.


Related Reading


More Insights






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.