Dr. Rx

Hello again, Gentle Readers,

I have a feeling this is going to be a short one. The holidays are upon me like a ton of bricks. In fact, holidays or not, there seems to be less and less spare time in my life these days. Might have something to do with my sci fi addiction, I suppose.

Still no progress on the base-64 encoder. We'll see about next month. In the meantime, "A. Clark", aclark@CanadaMail.com, wrote:

    I read the article in the 9810 newsletter and couldn't help but wonder if it was the same problem I'd run into. You mentioned the person who asked the question was on MVS... could it be that they are getting there mail through IBMMAIL? It has a tendency to re-encode attachment so while a base64encoded file may be decoded anywhere, once IBMMAIL touches it, all bets are off. I've come up with a two small pipes for decrypting our IBMMAIL attachments. These use CMS PIPEs but could be done in MVS BatchPipes too:

      'PIPE <' Arg(1),
      ' | XLATE from 819 to 1047',
      ' | DEBLOCK CRLF',
      ' | UUDECODE',
      ' | DEBLOCK CRLF',
      ' | >' Word(Arg(1),1) 'DECODED A'

    That works for Binary files, and if it's e-mail/text you need to do an ASCII-EBCDIC conversion too:

      'PIPE <' Arg(1),
      ' | XLATE from 819 to 1047',
      ' | DEBLOCK CRLF',
      ' | UUDECODE',
      ' | XLATE A2E',
      ' | DEBLOCK CRLF',
      ' | >' Word(Arg(1),1) 'DECODED A';

    We don't need to do this too often but it could be combined into one and take actions based on the filetype.

This stuff is greek to me, but it sure looks good. I hope it's of some help to someone. If anyone tries it out, let me know how it worked for you.

I have fumbled along with my plan to create a Windows Help File out of the Regina documentation, which is in MS Word format. No joy so far. I've tried the windows help compiler (HCW.EXE), which is supposed to translate a Word document into a help file, in conjunction with several helper products. The documentation for HCW suggests that only crazy people would try to create help files with HCW alone. So far, I have had no luck with enticing anything to convert the generated table of contents into a hyperlinked TOC for the help file. Surely this is not too much to ask. And I think a TOC is so necessary for a useful help file that it's not worth proceeding till I solve this.

I think we have a copy of RoboHelp around. I'm going to try that.

Along these lines, I received another note from "A. Clark", aclark@canadaMail.com, about this issue:

In my quest for an easy GUI developer for Rexx, I have started looking into MAID (see Greg Schofield's Scriptor's Maid in this newsletter). After my request for an eval copy was declined (snort!), I dusted off the wallet and actually spent some money. After an initial problem because MAID insists on being installed in a directory with no spaces in its name, I'm off. I have checked out some of the examples and looked at the development interface. Haven't written a GUI yet myself. Will keep you posted.

Keith, kjoswal@home.com, wrote:

    Dear Dr. Rx, I guess I should have better things to do than nit-pick (I'm not nit-picking with you, of course) but I am writing this anyway because maybe I actually am thinking about this wrongly and I could learn something here.

    I have seen the phrase 'uninitialized Rexx variable' in every Rexx book and teaching guide that I've looked at. And they usually go on to say something about the initial value being the name of the variable itself. I don't think this is technically accurate. I think there actually is no such thing as an uninitialized Rexx variable. If a symbol is not a Rexx variable that has already been assigned a value, then it is simply a constant.

    Granted the end result would appear to be that a variable name that has never been given a value has its own name as initial value. And granted that this is an easy way to explain it to someone learning Rexx. But I just can't seem to let this go.

    At some point in my past, I believe I looked up the source of the VM implementation of Rexx and found that when Rexx (VM Rexx, anyway) is analyzing a Rexx statement to prepare it for execution, a symbol which is a candidate for being a variable is first looked up in the Rexx variable pool to get its value. If not found, the symbol is not considered a variable and other routines are called to figure out what else it might be, usually resulting in it being handled by the 'constant handler' if I may call it that. Is this really what's happening? And if so, is it of any use to think about it the right way or should I just let it go?


Keith - In effect, you're nearly correct. However, consider that a variable can either be uninitialized (in which case it's arguably a constant), or can have been given its own name (uppercased) as its value. The appearance will be identical, but the implications could be quite different. This condition can be checked with the symbol() function (NOTE: symbol()'s argument must be quoted!). Here's an example:

    /* all SAYs display "ABCD", but the value of SYMBOL("abcd") changes from "LIT" to "VAR" and back */
    say abcd
    say symbol("abcd")
    say abcd
    say symbol("abcd")
    drop abcd
    say abcd
    say symbol("abcd")

However, the fact that it can be checked obviously means that Rexx remembers, and knows the difference between a variable which has been given its uppercase name and one which hasn't been initialized yet.

I expect that the converse of what you assert is true--that all unquoted Rexx constants are actually treated as uninitialized variables. I put constants inside quotes to keep the Rexx interpreter from treating them like variables and wasting time checking for values. If the only non-quoted strings in your Rexxes were the ones you intended to use as variables, you might be happier to accept that before you gave them values, they were "uninitialized variables".

And you'd make the stylists happier, too. The NOVALUE condition section in the Regina documentation says (in part), "It is considered bad programming practice not to initialize variables...."

You can make sure you have either initialized or quoted all strings by adding

    signal on NOVALUE

to the beginning of your Rexxes and

    say "NOVALUE condition raised in line" sigl":" sourceline(sigl)

to the end.

- Dr. Rx

"albert smid", asmid@ibm.neta, asks:

    In the past I did quite a bit of development in REXX OS/2 environment. Now I have moved into the AIX world. One of the first thinks I did was the procurement of the REXX/6000 software. Within this environment I am missing some functionality like DATE() conversions, syssleep, sysfiles etc. Are there additional libraries on the market to obtain these functions or is it up to the user to develop these?

This is out of my area of expertise. Does anyone have any suggestions for Albert?

Well, that's the bottom of the mailbag, and I'm fuzzed. Keep those cards and letters coming, folks!

Dr. Rx, Dr_Rx@Hotmail.com