# Programmeren in REXX/Voorbeeld 2

Ons tweede uitgewerkt programma is handig om na te gaan welke conversies kunnen werken en welk resultaat we mogen verwachten. We leerden de conversiefuncties kennen in Programmeren in REXX/Functies deel 2#Omzetten van formaten. Het is echter niet altijd zeer intuïtief om te weten welke functie tot het beoogde resultaat leidt.
Een alfabetisch karakter omzetten naar een decimaal getal (C2D) lukt al bijvoorbeeld niet. En, moeten we het karakter "A" naar hexadecimaal of naar decimaal omzetten om zijn plaats in de karaktertabel te kennen ? Hoe kan het karakter "A" binair worden voorgesteld ? Enzovoort. Al deze vragen worden op een overzichtelijke manier beantwoord met dit programmaatje.
REXX-code: XtoX.rex
* 1 tot 10: mooie inleidende commentaar voor het programma. Ook historiek van veranderingen.
* 11: ophalen van het argument, waarbij eerste karakter in kar1 wordt gezet;
* 13: als links een ' of een " staat kunnen we te doen hebben met een hexadecimale notatie;
* 14: maar dan moet rechts een "X" staan;
* 15: dan zetten we hex=1 en vertalen we een eventuele " in '. Gewoon altijd het argument vertalen mag niet, want dan zou het argument geen ' of " meer mogen zijn;
* 17: als we nu een hexadecimale notatie hebben...
* 18: halen we de hexadecimale karakters eruit...
* 19: we gaan na of de karakters geldige hexadecimale karakters zijn, en...
* 20: tonen foutbericht en stoppen de procedure met code 5 als dat niet het geval is.
* 21: anders zetten we de hexadecimale karakters om naar gewone karakterstring;
* 24: nu roepen we een test subroutine op, één voor één met de namen van de mogelijke conversiefuncties;
* 34: de functie pikt de naam van de conversiefunctie op;
* 35: dit is de voornaamste regel in deze procedure. Door een signal on syntax zetten we de detectie van syntaxis fouten aan. Indien een fout wordt ontdekt springen we naar het label syntax:;
* 36: omdat we de naam van de functie als variabele binnenkregen moeten we een interpret bevel gebruiken om de functie op te roepen. Sommige conversies zijn echter niet toegelaten, voornamelijk als een niet numerieke string een getal zou moeten worden via de D2... functies;
* 37: heeft de functie wél een resultaat gegeven, dan kunnen we dat afdrukken, en de functie beëindigen;
* 40: de syntax: routine wordt dus opgeroepen bij een ongeldige conversie. We melden dit ook en keren tenslotte ook terug naar de hoofdroutine.
Meer over signal on syntax leren we in het hoofdstuk Debugging. Laten we naar een paar keer het programma uitvoeren:
Onze hexadecimale waarde '42'x is in het begin van het programma als dusdanig herkend en omgezet naar het karakter "B". Dit karakter proberen we nu op alle mogelijke manieren om te zetten. Het is geen numeriek getal, dus dat de omzetting van decimaal mislukt was te verwachten. Merk ook op dat het nuttig is zowel de karakterwaarde van het resultaat als de hexadecimale notatie ervan te tonen. We zien inderdaad dat X2C(B) een raar karakter produceert. Hexadecimaal heeft het de waarde '0B'x, en dat ligt in de reeks controlekarakters. Als we het programma met karakter "A" als parameter uitvoeren, hebben we een mooi voorbeeld van wat er kan gebeuren:
Bij de X2C omzetting bekomen we de waarde '0A'x en dat is een Line-Feed... dus we gaan inderdaad naar de volgende lijn om het resultaat te tonen, en het alignement van de tekst gaat verloren.
In het begin van het hoofdstuk vroegen we ons af hoe we de binaire voorstelling van het karakter "A" konden bekomen. Wel, uit deze resultaten kunnen we besluiten dat X2B al zeker niet de goede oplossing is, we moeten een dubbele conversie hanteren, namelijk X2B(C2X(A)). Inderdaad:
Die 41 is de hexadecimale voorstelling van het karakter A, dus binair bekomen we "01000001"b. Idealiter zou ons programma dus ook alle dubbele omzettingen moeten uitproberen zodat het voor ons nog gemakkelijker wordt. Maar dit laten we aan de lezer over.
In het laatste voorbeeld is enkel de B2X omzetting niet meer mogelijk omdat we geen binaire string als input hebben gegeven.
Zonder verdere uitleg geven we nog een tweede, gelijkaardig programma cadeau. Het toont alle formaten waarin een bepaalde datum kan worden gemaakt met de date functie:
REXX-code: RexxDates.rex
Dit is een mogelijke output van het programma:
en indien een datum is opgegeven:
Dit tweede voorbeeld hoeft misschien een extra woordje uitleg: nu geven we een datum mee als parameter. Maar we zeggen nergens welk formaat die datum heeft. In dit geval kan 20111216 zowel een geldige Base datum als een geldige Sorted datum zijn. Daarom test RexDates welke formaten het kunnen zijn. En dus bevat het antwoord die twee kolommen, de eerste voor het geval dat input een Base datum is, de tweede als het een Sorted datum zou betreffen.