BREXX - Getting Better by Leaps and Bounds

Review by Frank Clarke, REXX Language Association

A few years back, I wrote a review of BREXX (then v1.2, I believe) and summarized it as "free, not perfect".  Since then, BREXX has been reissued at least twice and is now v2.0.  BREXX is supplied for DOS and UNIX.

The new BREXX20 is faster; that's to be expected.  The surprise is that it seems much faster.  It has more function; no big surprise there.

BREXX functions (new ones arriving daily, it seems) are appropriate for its small-machine environment; dinosaur-jockeys like me have a hard time relating to some of them, but the new BREXX clearly has lots of muscle.  The supplied manual seems very complete and is now issued in HTML-form.  Bill Vlachoudis has every right to be proud of the newest version.

I still don't know Unix, and I still can't speak directly to that implementation, but the DOS version is such a complete implementation that most users will find it adequate to any task.  It still has its several platform-specific extras, like goodies hidden at a birthday party, just waiting to be discovered.  See the section on "DOS Functions" if you're like me and have no patience.


As with any version of REXX, I/O is going to be platform-dependent.  BREXX provides several built-in routines (OPEN, CLOSE, SEEK, READ, WRITE, and EOF) which are adequate for most purposes (also, see LOAD below).  Commands may be directed to DOS (choose COMMAND, SYSTEM, or DOS; they're all the same) or to INT2E which executes via interrupt 2E.  Host commands (other than via INT2E) may have "(STACK", "(FIFO", or "(LIFO" appended to cause their output to be placed directly into the REXX queue (_very_ VM-ish, _very_ handy!):

    "TYPE" filespec "(STACK"
    do queued()

and it works the other way, too:  "STACK>" at the beginning of a command causes the queue to be directed to STDIN.

Math functions:

The author has also provided several (built-in) mathematical subroutines which are not normally part of REXX (SIN, COS, TAN, arc- and hyperbolic- variants, EXP, SQRT, LOG, LOG10, etc.).  The absence of support for NUMERIC DIGITS (it's mentioned in the supplied documentation) may not be noticed because of the excellent subroutines.


And then there's JUSTIFY, a curious little routine which pads between words to cause a line to fit neatly within margins.  (I once wrote an editor for the Big Machine, and this function caused me no end of grief.)


BREXX stores its variables in a binary tree, the contents of which are accessible via the VARTREE function.  VARTREE makes it possible to 'checkpoint' a BREXX program and restart it later at the point of interruption.


Where once there was only a 'destroy stack' function, there now exists also a 'create stack' making recursive queue applications possible.  This was (to me) a major flaw with earlier versions.  This inveterate queue-juggler is very pleased to see it 'fixed'.


BREXX provides this facility to allow general-use code to be kept as external source code which is brought in (LOADed) with a single call.  If (for example) you always build your routines around a skeleton of diagnostic aids, they can all be kept in one place and LOADed as part of an initialization routine, and... when you upgrade the diagnostic routines, all your other software immediately benefits from their improvement.  I wish we had that on MVS!

BREXX is quite compliant to the language spec.  Problems I brought to the author's attention at the time of the last BREXX review were promptly addressed, a measure of the author's commitment to quality.

And it's still FREE.

The author of BREXX, Vassilis N. Vlachoudis, can be reached at:


Frank Clarke,