In antwoord op frizhd: Laten we dan om te beginnen de lat niet hoger leggen dan
M1. Eén niveau lager is
M0, een module waar je per ongeluk in kunt rollen. Zoiets kan in Cobol voorkomen, maar in Basic niet. Daar hoeven we dus niet verder over na te denken. Het laagste niveau is non-modulariteit oftewel
non-M, waar je ook zomaar in kunt rollen. Mijn eerste voorbeeld van 1 september, met de GOSUB-constructie, was
non-M. Het tweede, met SUB ... END SUB, was
M1. Over die laatste twee niveaus ga ik nu wat vertellen.
Saltimbocca:Haal de volgende ingrediënten tevoorschijn: 4 kleine schnitzeltjes, ieder ca. 50 g — 4 plakjes rauwe ham, even groot als de schnitzels — 12 blaadjes salie — zout — peper — boter — 1 glas marsala of witte wijn.
De schnitzeltjes moeten goed platgeslagen worden. Strooi er wat zout en peper op en leg op elk lapje vlees een plakje ham en daarop 3 salieblaadjes. Rol ze op en steek ze vast met een cocktailprikker. Bak ze zachtjes aan alle kanten bruin in hete boter, giet de marsala of wijn erop, laat even pruttelen, dan het vuur lager en het deksel op de pan. Gedurende 10 minuten heel zacht laten sudderen en dan onmiddellijk opdienen.
Recept voor ZabaglioneHaal de volgende ingrediënten tevoorschijn: 6 eidooiers — 6 volle theelepels suiker — 8 eetlepels marsala — waaierbiscuits of lange vingers.
Zorg vooral dat zowel eieren als marsala goed op kamertemperatuur zijn. Klop de dooiers met de suiker samen tot een luchtige schuimige lauwe massa, die steeds lichter van kleur wordt. Doe dit na 5 minuten kloppen verder boven het vlammetje van een réchaud. Voeg dan zeer geleidelijk en steeds goed kloppend de marsala toe. De massa schift als de temperatuur te ver boven lauw uitkomt! Giet het mengsel in lichtverwarmde hoge glazen zo gauw als het licht begint te binden. Geef er een waaierbiscuit of lange vinger bij.
Einde van het receptAls je deze post leest op de manier waarop een compiler of -interpreter te werk gaat, dan heb je, bij deze zin aangekomen, inmiddels saltimbocca klaargemaakt. Omdat je daartoe opgedragen werd, want alle zinnen tot aan het volgende recept staan in de gebiedende wijs. En als ik nu zou zeggen: "ga naar
Saltimbocca", dan moet je het nog een keer doen. Ik zal het je besparen.
Bij het tweede recept ligt de zaak anders. Het bevat eveneens opdrachten, maar louter de aanwezigheid van de tekst
Recept voor Zabaglione t/m
Einde van het recept is op zichzelf geen opdracht om dat recept dan ook maar meteen uit te voeren. Het is alleen maar een vastlegging van dat recept, wat nochtans tot niets verplicht. Je kunt het voor kennisgeving aannemen, leuk voor als je later eens een keer zabaglione wilt bereiden. Ik ga je er nu in deze post niet — door "voer
Recept voor Zabaglione uit" te roepen — toe dwingen, maar ga gerust je gang als je omwille van een tweede verzetje even uit de rol van compiler/interpreter wilt stappen. Windows doet zo tussendoor ook wel eens dingen voor zichzelf, heb ik gemerkt, dus hoe zou ik je zulke pleziertjes durven ontzeggen?
Het codesegment 200–299 uit mijn eerste programma en het saltimbocca-recept hier in deze post zijn geen van beide een module. De SUB
CONCAT en het zabaglione-recept zijn dat wel. Om ontijdige uitvoering van een
non-M-segment te voorkomen, moet je deze lang genoeg zien te ontwijken, terwijl de uitvoering van een
M1-segment pas plaatstvindt als je er uitdrukkelijk om vraagt. Kortom, een ergens rondslingerend recept verplicht tot niets, maar aan een je toebulderende chefkok (de programmeur) kun je je als koksmaatje (de compiler/interpreter) in de keuken niet onttrekken.
Hopelijk helpt deze analogie met de gemoedelijke wereld van het kokkerellen je enigszins een voorstelling van het elementaire verschil tussen
non-M en
M1 te maken. Probeer je hiermee vertrouwd te maken door veel met
M1-modularisering te oefenen (mijn recept voor conversie van een
non-M-programma naar een
M1-programma staat direct onder het eerste voorbeeldprogramma). Wanneer je er op die manier eenmaal gevoel voor hebt gekregen, valt er te denken aan de volgende stap: van
M1 naar
M2 c.q. het onderscheid tussen lokale en globale variabelen.
Wat die fruitige vermenigvuldiging in Python betreft, zie ik gaarne een codevoorbeeld dienaangaande tegemoet. Zelf heb ik, als antwoord op je link
Python - The Emperor's New Clothes met een doorverwijzing naar
Why is there no goto?, iets interessanters op het oog. Ik zal er een dezer dagen wat van laten zien.
Ja, heus. In versie 5.5 (bronze edition, € 4,71) van rond de eeuwwisseling tenminste. Ik test dat soort dingen voordat ik ze op een forum gooi. En wat staat je in de weg om het zelf uit te proberen? Ik had uit een eerdere post de indruk gekregen dat je je ook wel eens met True BASIC hebt ingelaten.
Demonstratie van hoe verschillende handgrepen tot dezelfde uitkomst leiden. Het gaat niet zozeer om die uitkomst (het programma is in feite volkomen zinloos), maar om te laten zien op welke verschillende manieren je een programma intern kunt organiseren om een zeker doel te bereiken. Op deze kleine schaal maakt het allemaal bijzonder weinig uit, maar bij opschaling gaat die organisatie wel degelijk een rol spelen. En ook wanneer je als programmeur gebruik wilt maken van nieuwe faciliteiten die een taal te bieden heeft (hier hebben we het dan toevallig over Liberty BASIC, dat wel een en ander in huis heeft waar je met alleen je GW-BASIC-vaardigheden niet mee wegkomt). Je sluit jezelf hiervan buiten als je niet kunt omgaan met de zeden en gewoonten die daarbij horen. Je kunt bewust voor een dergelijke abstinentie kiezen. Niets op tegen, als je dat willens en wetens doet.
Ik heb m'n best gedaan om je tot niveau
M1 te brengen.
Als het om regel 200 en 210 in het eerste programma gaat: 200 stelt een gegevenspaarscheider oftewel separator C$ in. Wanner L$ of R$ een lege string is, blijft de paarscheider ook leeg. Wanneer beide variabelen echter één of meer tekens bevatten, wordt de komma als paarscheider aangehouden. In regel 210 worden L$, de paarscheider en R$ tot één string aaneengeregen, omgeven door de scherpe haakjes < en > (True BASIC gebruikt daar de stringconcatenatie-operator & voor) en in die vorm toegekend aan de variabele P$. In de andere twee programma's gebeurt binnen de SUB CONCAT precies hetzelfde.
Update van enige flink wat minuten later: Het was me ontgaan dat er inmiddels een tweede threadpagina bij was gekomen. Ik denk dat ik de laatste post van frizhd toch wel beantwoord heb, zo willembever dat niet al een paar uur geleden gedaan heeft. Wat willembevers LB-programma's aangaat: let even op het spel in zijn LB-vertalingen met variabele P als index ten behoeve van het array A$. Zo werkt het ook inderdaad, maar de vrijheid om de waarde van P$ aan een willekeurige globale variabele toe te kennen is nu wel verloren gegaan. De SUB CONCAT resp. het segment [CONCAT] ... return is op deze manier onlosmakelijk verbonden aan dat array. Dat soort afhankelijkheden moet je als programmeur nou juist zien te vermijden.