Programmeren in REXX/Fundamenten: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
GuyDC (overleg | bijdragen)
Toevoegingen, herstructureren, verbeteren tekst
GuyDC (overleg | bijdragen)
Verbeteringen tekst - navigatiesjabloon
Regel 31:
Daarnaast kan het programma doorspekt zijn met commentaren (zie verder).
 
ElkWe vanzullen deze zinnen - die we vanaf nu lieveraanduiden met de "officiële" term '''statementsstatement'''. noemen -De statements wordtworden één voor één geanalyseerd en uitgevoerd. De analyse gebeurt van links naar rechts. Dit laatste kan soms van groot belang zijn.
 
Merk op dat een regel in het bestand dat de broncode bevat uit meer dan één statement kan bestaan, mits ze gescheiden zijn door een punt-komma.
De term '''token''' staat voor de bouwstenen waarmee REXX statements zijn opgebouwd. De tokens kunnen gelijk welke lengte hebben, tenzij er limieten worden opgelegd door de implementatie. Het beschikbaar geheugen is anders de ultieme limiet.
 
De term '''token''' staat voor de bouwstenen waarmee REXX statements zijn opgebouwd. De tokens kunnen gelijk welke lengte hebben, tenzij er limieten worden opgelegd door de implementatie. Het beschikbaar geheugen is anders de ultieme limiet. De soorten tokens zijn:
De soorten tokens zijn:
*constanten
*symbolen (instructies, functies of variabelen)
Regel 43:
*labels
 
Laten we al deze elementen nu in detail bekijken, te beginnen metbij commentaren.
<!--------------------------------------------------->
==Commentaren==
Regel 89:
Op z'n minst kunnen volgende karakters gebruikt worden:
A tot Z, a tot z, 0 tot 9, . (punt) en _ (liggend streepje)
Als een symbool niet met een cijfers of een punt begint, dan kan het een variabele voorstellen. Dit betekent dat men er een waarde kan aan toekennen d.m.v. een assignatie (variabele = uitdrukking).
 
Dus, een symbool zal, al naargelang zijn plaats in het programma, beschouwd worden als een variabele of als een instructie (bevel, functie).
 
De initiële waarde van een token is gelijk aan zijn naam in hoofdletters. Dus zullen in volgende zin
say a
beide woorden door REXX gezien worden als respectievelijk '''SAY''' en '''A'''. Het token '''SAY''' wordt door REXX daarna wel herkend als een bevel omdat, wat erop volgt, op het scherm afmoet te drukkenafdrukken. Het token '''A''' zal als variabele gezien worden vermits het niet tussen aanhalingstekens staat en niet met een cijfer of punt begint. Vermits in dit voorbeeld geen waarde werd toegekend blijft haar initiële waarde zolang "A". HetWe zal hierzullen dus eenuiteindelijk die letter "A" zijn die we op het scherm zullen zien verschijnen.
{{Bericht
|titel=Hoofdletter-ongevoelig (Case-insensitive)
Regel 132:
'''[[Programmeren in REXX/Bevelen,_deel_2#SIGNAL|SIGNAL]]''' en
'''[[Programmeren in REXX/Debugging#TRACE|TRACE]]'''.
Van een aantal kan men nu al vermoeden waartoe ze zullen dienen. Soms gebruiken we hiervoor ook de term ''instructies'' zoals in het Engels ''instructions''. Verwar dit niet met een volledige programmalijn, die we een statement noemen, noch met een regel in het bronbestand, want dit kan meer dan één statement bevatten.
<!--------------------------------------------------->
===Functies===
Regel 142:
 
Functies kunnen ook verschillen naargelang het besturingssysteem. Er bestaan tevens externe functiepakketten die kunnen worden toegevoegd aan de basisset.
HetWe iszullen tenslotteook mogelijkleren eigenhoe we zelf functies tekunnen schrijven.
 
We geven toch een voorbeeldje van een (basis-)functie:
Regel 151:
#het gelijkheidsteken beveelt om een waarde toe te kennen aan de variabele (assignatie);
#de toegekende waarde is alles tot aan het einde van het statement (hier impliciet het einde van de zin). De variabele ''a'' krijgt dus de waarde "tekst"
#het token "say" wordt herkend als een bevel. datHet moet alles wat volgt tot aan het einde van het statement op het scherm moet afdrukken;
#het token "length" wordt vervolgens herkend als een standaardfunctie die de lengte van zijn parameter moet opzoeken en teruggeven;
#het deel tussen haakjes is de eerste, en in dit geval enige parameter voor de functie. REXX ontdekt dat het een constante is, gevolgd door een variabele is. De variabele wordt door haar waarde vervangen, dusen de parameter voor de functie wordt uiteindelijk "Dit is een tekst";
de variabele wordt door haar waarde vervangen, en de parameter wordt uiteindelijk "Dit is een tekst";
#de functie '''length''' telt nu het aantal karakters en komt tot de waarde 16;
#het bevel '''say''' druktziet dus nog enkel het getal 16 afstaan, en drukt dit op het scherm af.
<!--------------------------------------------------->
==Labels==
Labels (letterlijk: etiketten), zijn plaatsen naar waar een programma kan springen (met de bevelen [[Programmeren in REXX/Bevelen,_deel_2#SIGNAL|SIGNAL]] of
[[Programmeren in REXX/Bevelen,_deel_2#CALL|CALL]], of nog als begin van een eigeninterne functie).
 
Een label bestaat uit een token gevolgd door een dubbele punt.
Regel 180 ⟶ 179:
Say "Dit is een"''','''
"tekst."
Merk op dat het voor commentaren over meerdere regels <u>niet</u> nodig is continuatietekens te gebruiken. De komma zal na het samenvoegen van de lijnen vervangen worden door een spatie.
Merk ook op dat het voor commentaren over meerdere regels '''niet''' nodig is vervolgtekens te gebruiken.
===Scheidingsteken===
De '''puntkomma''' laat toe instructiesstatements van elkaar te scheiden, zoals hier:
/* Meerdere instructies op één regel */
Say "Hello" ; say "Nice weather, isn't it?"
Regel 188:
{{Bericht
|titel=Programma opbouw - statements.
|bericht=REXX interpreteert programmalijnstatement per programmalijnstatement. Een programmalijnstatement eindigt
* bij een scheidingsteken, midden in een regel;
* bij het einde van een regel (line-end, een CrLf), tenzij een vervolgteken werd gebruikt. Zie [[w:Return_(toetsenbord)|hier]] voor uitleg over CrLf. Een scheidingsteken is dan niet vereist en wordt dus impliciet verondersteld;
* een scheidingsteken, midden in een regel;
* een impliciet scheidingsteken binnen een instructie. REXX veronderstelt een scheidingsteken na THEN, ELSE en OTHERWISE.
Om duidelijk een onderscheid te maken tussen de tekstregels of programmalijnen die de broncode opmaken, en de aparte logische eenheden die REXX als instructies uitvoert zullen we deze laatste vanaf nu liever met het
Engelse woord '''statement''' benoemen.
|type=info}}
 
===Bewerkingstekens===
Hiermee bedoelen we o.a. de tekens die toelaten op te tellen of af te trekken. We hebben, in volgorde van voorrang bij uitvoering:
* '''Prefix \ + of -''' aan het begin van het woord betekenen ze respectievelijk '''NOT''', positief of negatief.
* '''**''' machtsverheffing (exponentiatie) [5 ** 2]
Regel 212 ⟶ 210:
* '''| &&''' logische of (OR) en exclusieve of (XOR)
Bij vergelijkingen wordt het kortste lid tot gelijke lengte van het langste lid gemaakt door er spaties aan toe te voegen alvorens de vergelijking aan te vatten. Bij de '''strikte''' vormen van vergelijkingen wordt deze verlenging niet toegepast.
 
Een machtsverheffing gaat dus voor op een vermenigvuldiging of een deling. Deze gaan dan weer voor op optelling en aftrekking, enz. Men kan de volgorde van berekening aanpassen door ronde haakjes te gebruiken.
'''''(3+4)*5''''' is dus niet hetzelfde als '''''3+4*5'''''.
 
Het resultaat van een vergelijking is 1 (waar) of 0 (onwaar). Bij logische bewerkingen mogen enkel 1 of 0 gebruikt worden.
Regel 230 ⟶ 231:
De term '''concatenatie''' (met het bewerkingsteken &#124;&#124;) komt van het Engelse werkwoord '''to concatenate''' en betekent: aaneenkoppelen/-voegen/-ketenen. Er worden dus twee delen aan elkaar geklit. Maar dit vraagt toch om wat meer uitleg.
 
Het aantal spaties tussen tokens van statements heeft geen belang, ze zullen gereduceerd worden tot één spatie. (Verwar dit niet met spaties tussen woorden in een constante).
Ook de komma die gebruikt wordt om een instructie op een volgende regel verder te zetten zal vervangen worden door één enkele spatie.
 
Laten we nu even kijken naar volgende reeks statements:
x=1 ; y=2
say x y /* Toont &#171;1 2&#187; */
Regel 250 ⟶ 251:
if x"-"y = 1-2 then say 'OK' /* Niets, want "1-2" is niet -1 */
 
We willen hiermee duidelijk maken dat geeneen concatenatieteken niet nodig is wanneer variabelen aan constanten worden geplakt.
Maar willen we constanten aan constanten ketenen, dan is het concatenatieteken meestal wel nodig:
say "Dit is een zin""!" /* &#171;Dit is een zin"!&#187; */
Regel 258 ⟶ 259:
<!--------------------------------------------------->
=Speciale variabelen=
ErREXX zijnkent 3 gereserveerdespeciale variabelen in REXX:
# '''RC''', bevat de returncode van het laatst uitgevoerde commando dat door het besturingssyteem is uitgevoerd.
# '''RESULT''', bevat het resultaat van de laatst uitgevoerde functie.
Regel 265 ⟶ 266:
<!--------------------------------------------------->
=Stems=
REXX kent een speciaal soort variabelen, namelijk '''stems'''. De term komt van het Engels en betekent in dit geval dat het variabelen zijn die dezelfde stam hebben. Ze laten o.a. toe om vectoren (arrays) en matrices te simuleren, maar ze zijn meer dan dat.
 
EenDe stam van een '''stem''' bestaat uit een geldig token, gevolgd door een punt. Zo zijn "''jan.''" en "''p.''" geldige namen voor stems.
Zoals voor andere variabelen is de basiswaarde van een stem gelijk aan zijn naam in hoofdletters, hier dus "JAN." en "P.".
 
Een stem is enkel een impliciete definitie van een verzameling variabelen. Er zullen pas elementen in voorkomen indien we waarden toekennen aan '''samengestelde variabelen'''.
Een stem heeft geen voorgedefinieerde dimensie, er kunnen zoveel elementen aan toegevoegd worden als het geheugen van de computer toelaat.
<p id="SamVar">Een '''samengestelde variabele''' definieert dus een element van een stem. Ze is opgebouwd uit de naam van de stemstamnaam en een symbool dat na de punt is geplaatst. Dit tweede deel noemen we de staart (Engels: tail).
Zo zijn "jan.7", "jan.hello", "jan.i" en "jan.i.j" geldige elementen van de stem "jan.".</p>
jan.7 = 25
jan.hello = "Gisteren"
i=5 ; jan.i = 17
hello="Hello" ; jan.ihello = 17"Goeiedag"
j=7 ; jan.i.j=12
hello="Hello"
Tijdens de uitvoering zal REXX het token (de tokens) na het puntstaart interpreteren. Hebben we een constante of een getal, zoalsdan inhoeft geen verdere interpretatie. Dus, bij jan.7 dan is "JAN.7" de naam van het element van de stem "JAN.". Dit element heeftkrijgt in ons voorbeeld de waarde &#171;27&#187; gekregen.
jan.hello = "Goeiedag"
j=7
jan.i.j=12
Tijdens de uitvoering zal REXX het token (de tokens) na het punt interpreteren. Hebben we een constante, zoals in jan.7 dan is "JAN.7" de naam van het element van de stem "JAN.". Dit element heeft in ons voorbeeld de waarde &#171;27&#187; gekregen.
 
In het tweede gevalstatement stelt "''hello"'' een geldige variabele voor. waaraanVermits echterdeze nooitvariabele eengeen waarde is toegekend. Duskreeg, is haar impliciete waardwaarde "HELLO" en iswordt "JAN.HELLO" een element van de stem "JAN.". DitAan dit element wordt een waardedan &#171;Gisteren&#187; toegewezen.
 
In het derde geval, bijhebben "jan.i"we zaleen REXXvariabele zienin datde ''i''staart waarvan de waarde &#171;5&#187; bevat,is. zodatDus wordt het element nu "JAN.5" zal noemen en deeen waarde &#171;17&#187; zal ontvangentoegekend.
 
Net zo zal na de toekenning van de waarde &#171;Hello&#187; aan de variabele ''hello'', het element "JAN.Hello" (let op de hoofd- en kleine letters), de waarde &#171;Goeiedag&#187; hebbengaan gekregenbevatten.
 
InAls hetwe gevaltenslotte vanbij "jan.i.j"de laatste tenslotteregel komen, hebben beide i en j een waarde gekregen. enDaarom gevenleidt wede assignatie dusdat het element "JAN.5.7" de waarde &#171;12&#187; krijgt. Op deze manier kan men een matrix met 2 (of meer) dimensies simuleren, doch voor REXX zijn het gewoon allemaal elementen van een stem.
 
Als een stem gebruikt wordt om een reeks elementen te bevatten, gebruikt men vaak numerieke staarten (jan.1, jan.2, ...). Er is dan een soort conventie dat het aantal elementen (de dimensie) danvan de aldus opgebouwde vector in het element "''stem.0''" wordt bijgehouden. Verplicht is dit niet, doch sommige programma's of functies volgen deze conventie om aan te geven hoeveel elementen ze als resultaat hebben terug gegeven.
 
Noteer dat een eenvoudige assignatie als
Regel 301 ⟶ 299:
a="Dit is een hele volzin"
jan.a=17
zal aan het element "''JAN.Dit is een hele volzin''" de waarde &#171;17&#187; toekennen. Dit geeft interessante mogelijkheden waar we later nog zullen op zullen terugkomen.
<!---------------------------------------------------------->
=Programmabuffer ofte Stack=
Gegevens die ingevoerd worden vanuit externe bronnen &nbsp;- meestal het toetsenbord, maar ook andere programma's &nbsp;- kunnen in de zogenaamde '''stack''' of programmabuffer worden opgeslagen in afwachting van verwerking. Het is één van de manieren om gegevens uit te wisselen tussen programma's.
 
We kunnen deze buffer vergelijken met een stapel speelkaarten. Er kunnen kaarten onderaan of bovenaan worden toegevoegd., Zemaar ze worden steeds vanafvan bovenbovenaf terug weggenomen.
 
Worden de kaarten bovenaan bijgevoegd, dan zullen ze dus als eerste terug worden weggenomen en spreken we van '''LIFO''' (Last In, First Out). De laatst toegevoegde wordt als eerste terug weggenomen.
<br>Worden ze echter onderaan toegevoegd, dan zullen ze pas als laatste terug van de stapel worden genomen en spreken we van '''FIFO''' (First In, First Out). De kaarten kruipen als het waren van onder naar boven, waarbij de oudsteerst toegevoegde eerst wordenwordt weggenomen.
 
De bevelen die met de stack werken bespreken we in een volgend hoofdstuk.
Regel 317 ⟶ 315:
|bericht=In dit hoofdstuk leerden we over constanten, variabelen, bevelen en functies. We leerden de lees- en bewerkingstekens kennen. Ook hoe labels eruitzien en wat de stack eigenlijk is. De uitleg over stems mocht zeker niet ontbreken. Termen als token, assignatie en statement werden aangebracht.
 
Probeer deze in gedachten nog eens voor de geest te halen zodat we ze als gekend mogen beschouwen bij het aanvatten van volgende hoofdstukken.}}
 
}}
{{Sjabloon:Navigatie
|Boek =Programmeren in REXX
|vorige =Voor je begint
|huidige =Fundamenten
|volgende=Bevelen, deel 1}}
{{sub}}
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.