# Programmeren in REXX/Functies deel 1

In dit hoofdstuk gaan we dieper in op een eerste reeks functies die standaard aanwezig zijn in REXX.
Vermits REXX in de eerste plaats een karakter georiënteerde taal is, is het dan ook niet verwonderlijk dat veel functies strings behandelen. REXX kent ook de notie "woorden" zodat er ook daarvoor specifieke functies zijn.
De parameters die tussen vierkante haakjes worden genoteerd zijn optioneel. Er wordt in die gevallen een standaardwaarde (default value) aangenomen. Deze is dan onderlijnd. Veel functies voorzien ook in een pad-parameter. De term heeft niets met een soort kikker te maken, maar komt van het Engelse werkwoord "to pad", in de betekenis van opvullen of verlengen. Het pad-karakter zal meestal dienen om het resultaat aan te vullen tot een gevraagde lengte. Daar de standaardwaarde voor een pad-karakter steeds een spatie is noteren we niet telkens meer [pad | " "], maar kortweg [pad].

# Manipulatie van strings

Strings zijn dus karakterreeksen waarin alle mogelijke karakters ('00'x tot 'FF'x) kunnen voorkomen, inclusief spaties of controlekarakters.

## SUBSTR - Deel uit geheel halen

Deze functie haalt een deel (sub-string) uit een bron-string. De bronstring is het resultaat van een voorafgaande interpretatie.
Het gedeelte dat eruit gehaald moet worden begint bij de start-positie en krijgt een lengte. Indien lengte niet is opgegeven dan wordt de rest van de string genomen. Indien de lengte groter is dan het aantal karakters dat overblijft in de bronstring wordt het resultaat verlengd met het pad-karakter.
Dit zijn voorbeelden:
In het derde voorbeeld heeft het pad-karakter geen invloed. In het vierde geval wél, want er is niet genoeg materiaal meer in de zin om een string van 8 karakters te produceren, en dus moeten pad-karakters worden toegevoegd. In het vijfde voorbeeld is geen pad-karakter opgegeven, dus worden spaties toegevoegd. Het resultaat is wel degelijk 8 karakters lang!
Het voorlaatste voorbeeld toont dat de bron complex kan zijn. Bij het laatste voorbeeld is geen lengte opgegeven, zodat het resultaat alles vanaf beginpositie 4 tot het einde van de string bevat.

## LENGTH - Lengte van een string bepalen

Geeft de lengte van de string terug.

## LEFT - Linker deel uit een string halen

Hiermee halen we aantal karakters uit de string, te beginnen bij het eerst karakter. Indien het aantal groter is dan de string, dan wordt het resultaat verlengd met het pad-karakter.

## RIGHT - Rechter deel uit een string halen

Dit is, hoe kan het ook anders, het omgekeerde van left.

## STRIP - Een string afknippen

Deze functie elimineert alle spaties (of opgegeven karakter)
* zowel vooraan als achteraan de string met optie B[oth] (standaardoptie);
* enkel vooraan de string met optie L[eading] (leidend), of
* enkel achteraan de string met optie T[railing] (volgend).

## REVERSE - Een string omkeren

Keert de string eenvoudigweg om.

## COPIES - Een string herhalen

Retourneert een string die de oorspronkelijke string een aantal maal herhaalt. Er komen geen extra tussenliggende spaties bij !

## POS - Eerste positie van een substring in een string zoeken

POS geeft de eerste positie van de naald in de hooiberg. Normaal wordt vanaf de eerste positie gezocht, maar men kan optioneel pas vanaf de positie start beginnen zoeken. Wordt er niets gevonden, dan is het antwoord 0 (nul).
De naald niet beperkt tot één karakter, zoals men kan leren uit het laatste voorbeeld.

## LASTPOS - Laatste positie van een substring in een string zoeken

Zoals men kan verwachten is deze functie het omgekeerde van de functie pos.
Merk op dat indien de opzoekterm een lengte 0 heeft het antwoord ook 0 is. Wie verwacht immers iets te vinden als men op zoek gaat naar niets ?
* Voor een string zonder lengte of een lege string gebruiken we vanaf nu de Engelse term nullstring.

## SPACE - Een string opschonen

Geeft de oorspronkelijke string terug, doch met telkens hetzelfde aantal spaties of pad-karakters tussen elk woord. We kunnen dus ook alle spaties wegnemen door het aantal op nul te zetten.

## CENTRE - Een string centreren

Deze functie maakt een lijn van de opgegeven lengte waarin de string gecentreerd is. Aan beide zijden worden m.a.w. evenveel spaties (of pad-karakters) toegevoegd. Als de lengte kleiner is dan de string, dan worden er aan beide zijden karakters weggenomen.
Mike Cowlishaw, die REXX in zijn vrije tijd ontwikkelde is een Engelsman. Daarom noemde hij deze functie "centre". Doch, toen het als officieel product door de IBM laboratoria in de VS moest worden onderhouden heeft men het synoniem center moeten toevoegen om te voldoen aan de Amerikaanse schrijfwijze. We kunnen dus beide gebruiken.

## COMPARE - Strings vergelijken

Met deze functie kunnen we 2 strings met elkaar vergelijken. De kortste wordt even lang gemaakt als de langste met het pad-karakter. Als beide strings dan identiek zijn is het resultaat 0 (nul). Anders geeft de functie de positie van het eerste karakter dat verschillend is. Kleine- en hoofdletters hebben hierbij belang !

## INSERT - Een stukje toevoegen in een string

Schuift het nieuw stukje in de string, na de start-positie. Het toegevoegde stukje wordt eventueel verlengd tot lengte door er pad-karakters aan toe te voegen.

## OVERLAY - Een stukje van een string overschrijven

De functie overlay zal een nieuw stukje over de bestaande string plakken, beginnend bij positie start. Het nieuwe stukje kan eerst worden verlengd tot lengte door er pad-karakters aan toe te voegen.
In het tweede voorbeeld hebben we twee functies in elkaar gevlochten. De binnenste functie wordt eerst uitgevoerd. Ze geeft in dit geval «Dit is een zin» terug, dus met 2 spaties na het woord "is". Het resultaat wordt dan door de buitenste functie verwerkt en reduceert de spaties tot één enkel blanco karakter.

## DELSTR - Een deel uit een string wegknippen

Knipt een aantal karakters uit de string, te beginnen bij start. Als geen aantal is opgegeven elimineert de functie de rest van de bronstring.

## VERIFY - Uit welke karakters is een string opgebouwd ?

Met verify kunnen we nagaan of onze string is opgebouwd uit karakters die in de referentie staan. De controle begint aan start als die parameter is opgegeven. Indien aan deze voorwaarde is voldaan, dan is het antwoord 0 (nul). In het ander geval is het antwoord
* de eerste positie in string die niet voldoet als de optie Nomatch is opgegeven (dit is de standaard optie).
* de eerste positie in string die wél voldoet als optie Match is opgegeven.
Zo laat deze functie bijvoorbeeld toe na te gaan of een string enkel cijfers bevat.
We kunnen ook zoeken naar de positie van het eerste karakter dat wél in de referentie staat:
In dit voorbeeld is onze bron typisch voor een lijn uit een zogenaamd CSV-bestand (Comma Separated Values). Dit is een bestand dat door spreadsheet programma's kan worden aangemaakt of gelezen. Tussen elk veld staat een scheidingsteken. Maar dat scheidingsteken is niet noodzakelijk een komma zoals de naam laat uitschijnen. Als in een veld een komma kan voorkomen moet wel voor een ander scheidingteken gekozen worden. In ons voorbeeld gaan we op zoek naar het eerste karakter dat een komma, punt-komma of slash is. We veronderstellen dan dat dit karakter als scheidingsteken gebruikt wordt. Een aandachtig lezer zal echter inzien dat dit geen sluitende test is. Lees hier om meer te leren over CSV-bestanden.

## ABBREV - geldige afkorting

Deze functie geeft de waarde 1 (waar) als info gelijk is aan het begin van informatie en niet korter is dan lengte (als opgegeven). Anders is het antwoord 0 (onwaar). De standaardlengte is gelijk aan de lengte van de info parameter.
Merk op dat een nullstring steeds voldoet als geen lengte is opgegeven. Het volgende stukje programma is daarom een manier om een standaardwaarde te kiezen als geen optie is meegegeven met het programma:
Als de gebruiker van dit programma geen optie meegeeft, dan zal de eerste when abbrev("PRINT","") dus steeds voldoen.

# Werken met woorden

Met woorden bedoelen we groepjes aaneengesloten karakters die van elkaar gescheiden zijn door één of meer spaties. De woorden kunnen alle karakters bevatten, behalve de spatie natuurlijk.
* Op personal computers bestaat een conventie dat een tekst eindigt bij de eerste '00'x, maar voor REXX geldt die conventie niet en maken '00'x karakters dus deel uit van de string.
In de voorbeelden hieronder veronderstellen we steeds dat zin staat voor "Dit is een zin.".

## WORD - Eén woord uit een zin ophalen

Geeft het n-de woord uit de zin terug.

## SUBWORD - Woorden uit een zin ophalen

Het resultaat bevat alle (of een opgegeven aantal) woorden te beginnen bij het n-de woord uit de zin.

## WORDS - Aantal woorden in een zin

Geeft, zoals te verwachten valt, het aantal woorden in de zin. In ons geval 4 dus.

## DELWORD - Woorden uit een zin elimineren

Het resultaat van deze functie is de oorspronkelijke zin waaruit een aantal woorden, te beginnen bij het n-de woord, zijn verwijderd. Indien we geen aantal opgeven, dan elimineren we alle resterende woorden (en niet enkel 1 zoals men zou kunnen denken).

## WORDLENGTH - Lengte van een woord in een zin

Geeft de lengte van het n-de woord in de zin. Als er geen n-de woord is, dan is de lengte uiteraard nul.

## WORDINDEX - Positie van een woord in een zin

Vertelt op welke karakterpositie het n-de woord in de zin begint.

## WORDPOS - Plaats van een woord in een zin

Zegt ons het hoeveelste woord zoekterm in de zin is. Eventueel kan men de zoektocht beginnen bij het n-de woord. Is de string niet gevonden dan is het antwoord uiteraard nul. De zoekterm kan uit één of meer woorden bestaan.
Met het vierde voorbeeld leren we dat we wel degelijk naar een woord zoeken, want niet "zin" maar "zin." komt als woord in de bron voor. Het laatste voorbeeld toont dat we kunnen zoeken met een zinnetje. Meer zelfs, de spaties in de zoekterm hebben daarbij geen belang.