Programmeren in REXX/Fundamenten: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
GuyDC (overleg | bijdragen)
Toevoeging uitleg over labels
GuyDC (overleg | bijdragen)
Kleine verbeteringen
Regel 1:
 
{{Programmeren in REXX}}
=Fundamenten van REXX=
 
In dit hoofdstukjehoofdstuk bespreken we de voornaamste karakteristieken van REXX, zoals zijn typische kenmerken, bouwstenen en syntaxis.
 
==Typische kenmerken==
Regel 11 ⟶ 10:
Dit heeft als voornaamste gevolg dat er geen declaraties moeten worden gemaakt voor variabelen, zoals in de meeste andere programmeertalen wel het geval is.
 
Daarnaast is REXX in de meeste gevallen een ''[[w:interpreter|interpreter]]''. Op mainframe besturingssystemen (zOS[[w:z/OS|z/OS]] en zVM[[w:z/VM|z/VM]]) bestaan compilers voor REXX.
 
Hiermee wordt bedoeld dat REXX het programma lijn voor lijn in 2 afzonderlijke stappen zal uitvoeren. De eerste stap is een interpretatie van de instructie en omzetting naar interne code (te vergelijken met een compilatie) en als tweede stap de uitvoering. Er zijn wel optimalisaties voorzien om niet telkens de interpretatiestapinterpretatie-stap te hoeven doen, bv. in geval van een lus. Maar dit heeft als gevolg dat REXX het in uitvoeringssnelheid in de meeste gevallen niet kan winnen van gecompileerde programma's. Daartegenover staat echter dat de ontwikkeling van een werkend programma dikwijls veel sneller kan. De interpretatiestappen kunnen ook voordelen hebben, bijvoorbeeld bij het debuggen.
 
Velen beschouwen REXX in eerste instantie enkel als een vervanger voor scripting (BAT-files). (en ook op de mainframeDat was datook het eerste doel). Dochop mainframes, doch, de taal is volledig genoeg om er ook alle andere klassieke programmatietakenprogrammeertaken mee te vervullen. Op de snelle PC's (en zeker mainframes) van tegenwoordig kan deze tragere uitvoeringstijd een verwaarloosbare handicap zijn, en ruimschoots gecompenseerd worden door de snelheid van ontwikkeling. Zeker in die gevallen waar het programma slechts sporadisch of zelfs éénmalig moet worden uitgevoerd zal REXX een zeer interessant alternatief voor andere programmeertalen zijn.
 
==Bouwstenen==
Regel 30 ⟶ 29:
Commentaren kunnen over meerdere lijnen gaan en een commentaar kan een ander commentaar bevatten (geneste commentaren).
 
OmOp historischesommige redenensystemen <u>moet een REXX programma beginnen met een commentaar</u>, desnoods een ''leeg'' commentaar zoals hier:in een volgende voorbeeld.
Andere implementaties of systemen vereisen dat niet. Toch blijft het een goede gewoonte om het programma te beginnen met een korte beschrijving,
en eventueel zelfs de naam van de auteur, creatiedatum en historiek van veranderingen.
/* */
say "Hello" /* Dit zal Hello op het scherm zetten */
Regel 53 ⟶ 54:
Een getal is een reeks cijfers, met eventueel een decimaal <u>punt</u> (geen komma dus!) en/of een minteken voor negatieve getallen. Exponentiële notatie kan ook worden gebruikt.
Dit zijn allemaal geldige getallen:
17 98.07 -101 12.2e6 73e-128 '-17.9' ' 11.22 '
Als men zich de fundamentele regel van REXX herinnert, dan kan men begrijpen dat hetde laatste getal2 getallen (als een constante voorgesteld), ook geldig iszijn. Nogmaals, alle woorden zijn karakterreeksen tot eventueel blijkt dat er moet mee gerekend worden. En de blanco karakters worden ook verwaarloosd bij berekeningen.
 
===Symbolen===
Met symbolen bedoelen we ''woorden'' bestaande uit deeen volgendereeks karakters:.
 
A tot Z, a tot z, 0 tot 9, @ # $ &cent; . ? | _
Welke karakters kunnen gebruikt worden hangt af van het systeem waarop men werkt en van de codepages die gebruikt worden. Er is ook een verschil tussen ANSI (PC) en EBCDIC (mainframes).
Op z'n minst kunnen volgende karakters gebruikt worden:
A tot Z, a tot z, 0 tot 9, @. #(punt) $en &cent; ._ ?(liggend | _streepje)
Cijfers en het punt mogen niet als eerste voorkomen.
 
De term ''woorden'' moet dus in een brede context gezien worden, want er kunnen naast letters ook andere tekens voorkomen. In het Engels spreekt men van '''token'''s, en omdat de term ''woorden'' een meer beperkte betekenis heeft, zullen we liever deze Engelse term verder liever gebruiken.
Elke token is van andere gescheiden door één of meer blanco karakters of bewerkingstekens.
 
Regel 71 ⟶ 75:
 
{{Bericht
|titel=Karaktergrootte onbelangrijk (Case-insensitive)
|bericht=WeRexx kunnenmaakt geen onderscheid maken tussen kleine letters en hoofdletters (Engels: case-insensitive). "'''ABC"''' isverwijst dus naar hetzelfde symbool (variabele, instructie)token als "'''abc"''' of "'''Abc"''', want uiteindelijk worden ze voor REXX toch allemaal "'''ABC'''. Constanten kunnen natuurlijk wél bestaan uit gemengde karakters ("Hello" is niet gelijk aan "HELLO").
|type=waarschuwing}}
 
Regel 95 ⟶ 99:
'''[[Programmeren in REXX/Commando2#QUEUE|QUEUE]],'''
'''[[Programmeren in REXX/Commando2#RETURN|RETURN]],''' '''[[Programmeren in REXX/Commando1#SAY|SAY]],'''
'''[[Programmeren in REXX/Commando1#SELECT|SELECT]],''' '''[[Programmeren in REXX/Commando2#SIGNAL|SIGNAL]],''' en
'''TRACE''' en '''[[Programmeren in REXX/Commando1#UPPER|UPPER]]'''. Van deeen meesteaantal kan men nu al vermoeden waartoe ze zullen dienen.
 
===Functies===
Regel 103 ⟶ 107:
waarbij het open-haakje zonder spatie na de functienaam moet komen.
 
Standaard bezit de REXX taal reeds een hele reeks standaardfuncties. Een opsomming zou ons hier dus te ver leiden. We komen de meeste ten gepaste tijde wel tegen.
 
ZeFuncties kunnen ook verschillen pernaargelang het besturingssysteem, en er bestaan tevens externe functiepakketten die kunnen worden toegevoegd aan de basisset.
Het is tenslotte mogelijk zijn eigen functies te schrijven (zie later).
 
Toch een voorbeeldje van een (basis-)functie hier:
say '''length'''("Dit is een tekst")
De functie '''length''' retourneertgeeft de lengte van zijn parameter terug. We verwachten hier dus een waarde 16 als antwoord.
 
===Labels===
Labels (letterlijk: etiketten), zijn plaatsen naar waar een programma kan springen (met een [[Programmeren in REXX/Commando2#SIGNAL|SIGNAL]],
[[Programmeren in REXX/Commando2#CALL|CALL]] of een oproep van een functie).
 
Een label wordt gevormd door een token gevolgd door een dubbel punt, en moet als eerste token van een lijn voorkomen. Bijvoorbeeld:
signal MijnLabel /* We springen verder */
[instructies]
Regel 123 ⟶ 129:
 
Ook voor labels geldt dat ze ''case-insensitive'' zijn, dus MijnLabel en MIJNLABEL zijn hetzelfde, en gewoon een speciale vorm van token.
 
Het is zelfs mogelijk meerdere labels na elkaar te gebruiken, waarbij ze te beschouwen zijn als elkaars synoniem.
 
===Leestekens===
Regel 130 ⟶ 138:
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.
 
====Scheidingsteken====
Regel 136 ⟶ 144:
/* Meerdere instructies op één regel */
Say "Hello" ; say "Nice weather, isn't it?"
 
{{Bericht
|titel=Programma opbouw
|bericht=REXX interpreteert regel per regel (Engels: statement). Met een regel bedoelt men een reeks tokens beëindigd met:
* het einde van een lijn (een line-end, een CrLf bvb), tenzij een vervolgteken werd gebruikt.
* een scheidingsteken (;)
* soms een impliciet scheidingsteken binnen een instructie.
Als we '''if voorwaarde then instructie else instructie''' schrijven, hebben we eingelijk
'''if voorwaarde; then; instructie;else;instructie''' geschreven.
|type=info}}
 
====Bewerkingstekens====
Regel 155 ⟶ 173:
 
==Concatenatie==
De term '''concatenatie''' die we bij het bewerkingsteken || hebben gebruikt komt van het Engelse werkwoord '''to concatenate''' en betekent: aanelkaaraaneenkoppelen/-voegen, -plakken of /-ketenen.
 
Toch moeten we hier iets meer over uitweiden.
Regel 204 ⟶ 222:
Een stem heeft geen gedefinieerde dimensie, er kunnen zoveel elementen aan toegevoegd worden als het geheugen van de computer toelaat.
 
Een '''samengestelde variabele''' is opgebouwd uit de naam van een stem 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.'''.
 
Regel 226 ⟶ 244:
In het geval ''jan.i.j'' tenslotte hebben beide i en j een waarde gekregen en geven we dus het element ''JAN.5.7'' de waarde 12. Op deze manier kan men een matrix met 2 (of meer) dimensies simuleren, doch voor REXX zijn het allemaal elementen van de stem.
 
AlhoewelAls een stem geengebruikt dimensiewordt heeftom zaleen menreeks bijelementen conventiete hetbevatten, elementgebruikt 0men meestalvaak opvullennumerieke metstaarten het(jan.1, aantaljan.2, gekende elementen van de stem...). DitEr is nietdan échteen verplicht,soort dochconventie sommige programma's of functies zullendat het ''aantal'' elementen dat ze teruggevendan in het element ''stem.0'' wordt zettengezet.
Dit is niet écht verplicht, doch sommige programma's of functies volgen deze conventie om aan te geven hoeveel elementen ze als resultaat hebben terug gegeven.
 
Noteer dat na een eenvoudige assignatie zoals
piet. = 'Onbekend'
alle elementen van de stem waaraandeze niet''standaardwaarde'' expliciettoekent een(ook waardezij isdie toegekendreeds dezeeen ''standaardwaarde''waarde hebbenhadden). Dus zullen zowel ''PIET.7'' als ''PIET.Morgen'' een waarde "Onbekend" hebben zolang er geen andere waarde aan wordt toegekend.
 
Merk tenslotte op dat een samengestelde variabele er zeer complex kan uitzien:
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.