Skip to content

Latest commit

 

History

History
282 lines (193 loc) · 8.88 KB

cursus_modula_deel_1.md

File metadata and controls

282 lines (193 loc) · 8.88 KB
                 C U R S U S   M O D U L A - 2   ( 1  )


                           I N L E I D I N G

      Aangezien het  niet mogelijk  is om  in ��n  deel iemand die
      helemaal niets van Turbo Pascal weet Modula-2 te leren ga ik
      de  volgende keer  van nul  af aan beginnen. Dit deel van de
      cursus is daarom bedoeld voor MSX'ers die al ervaring hebben
      met Turbo Pascal.

      Als  je  niet  wilt  wachten  tot  Special  #7  dan  kun  je
      natuurlijk  altijd eens  inloggen bij  de Games BBS, daar is
      een Engelstalige  Modula-2 cursus  te vinden  en een  flinke
      hoeveelheid  voorbeeldsources. Bovendien  is er  een .PMA te
      vinden met uitleg van Pierre Gielen over het naar modulevorm
      overzetten van ML-routines.


                              O P B O U W

      Onderstaand voorbeeld laat de opbouw van een Modula-2 source
      zien.  Het programma vult een array met wortels en drukt dat
      array vervolgens af. Wat het programma doet is niet boeiend,
      het gaat om de opbouw.


      MODULE Opbouw;

      (*
              Auteur      : Stefan Boer
              Versie      : 1.0
              Last updated: 09/06/94
      *)


      FROM MathLib IMPORT
              Sqrt;


      CONST
              AantalWortels = 10;


      TYPE
              WortelIndexType = CARDINAL [1..AantalWortels];
              WortelLijstType = ARRAY WortelIndexType OF REAL;


      VAR
              WortelLijst: WortelLijstType;


      PROCEDURE BerekenWortels(VAR WortelLijst: WortelLijstType);

      VAR
              i: WortelIndexType;

      BEGIN
              FOR i := 1 TO AantalWortels DO
                      WortelLijst[i] := Sqrt(FLOAT(i));
              END;
      END BerekenWortels;


      PROCEDURE PrintWortels(WortelLijst: WortelLijstType);

      VAR
              i: WortelIndexType;

      BEGIN
              FOR i := 1 TO AantalWortels DO
                      WRITELN(WortelLijst[i]);
              END;
      END PrintWortels;


      (* Hoofdprogramma *)

      BEGIN
              BerekenWortels(WortelLijst);
              PrintWortels(WortelLijst);
      END Opbouw.


      Merk op  dat de  definitie van  MathLib afwijkend is van wat
      Wirth  voorschrijft  bij  Turbo  Modula-2!  Wirth noemt  hem
      MathLib0  en de  vierkantswortel heet bij hem sqrt, niet met
      een hoofdletter dus!

      Pascalkenners zal de volgende dingen opvallen:

      - De source begint niet met PROGRAM maar met MODULE
      - ENDs van modules en procedures zijn gelabeld
      - De syntax van het FOR-statement is anders
      - Sqrt moet worden ge�mporteerd
      - Declaratie van subrange en array gaat anders

      Ik  zal  nu een  aantal verschillen  tussen Turbo  Pascal en
      Turbo Modula-2 bespreken.


                  C O M P O U N D   S T A T E M E N T

      Bij  Turbo Pascal  ziet een  IF statement er bijvoorbeeld zo
      uit:

      IF boolean expressie THEN
              statement1
      ELSE
              statement2;

      Om toch  meerdere statements te kunnen gebruiken heeft Wirth
      het  compound statement  bedacht, door  BEGIN en  END om een
      groep statements te zetten worden ze samen ��n statement.

      Dit kan  erg verwarrend zijn, vooral als je een zootje maakt
      van de layout. Bijvoorbeeld:

      IF a = 3 THEN
              WRITE('a is 3');
              WRITE('hallo');

      Door  de  layout  suggereer  ik  hier dat  het tweede  WRITE
      statement alleen wordt uitgevoerd als a gelijk is aan 3. Dit
      is  niet zo,  alleen het eerste WRITE statement hoort bij de
      IF. De juiste Pascal formulering zou zijn:

      IF a = 3 THEN
      BEGIN
              WRITE('a is 3');
              WRITE('hallo');
      END;

      Hier  hebben  we  dus  een compound  statement gebruikt.  In
      Modula-2 is het veel logischer:

      IF boolean expressie THEN
              statement sequence 1
      ELSE
              statement sequence 2
      END;

      Waarbij  een 'statement  sequence' bestaat  uit 0  (!), 1 of
      meer statements!  Er staat dus NOOIT een BEGIN en ALTIJD een
      END!  Bovendien  MOGEN  er  in  Modula-2 altijd  ; geplaatst
      worden. Bij Pascal is dat niet zo. Bijvoorbeeld:

      IF a = 3 THEN
              WRITE('hallo');
      ELSE
              WRITE('doei');

      geeft  een foutmelding in Pascal, de ; achter WRITE('hallo')
      is in Pascal niet toegestaan. In Modula-2 moet er natuurlijk
      nog een  END achteraan  en de puntkomma mag wel! (Maar hoeft
      niet.)

      Omdat een  puntkomma achter een statement in Modula-2 altijd
      mag zet ik er ook altijd ��n, dan kan ik me nooit vergissen!

      Bij WHILE, FOR en WITH gaat het net zo. Dus:

      WHILE boolean expressie DO
              statement sequence
      END;

      FOR loopvariable := startwaarde TO eindwaarde DO
              statementsequence
      END;

      WITH record-variabele DO
              statementsequence
      END;


                               T Y P E S

      Turbo Modula-2 kent de volgende atomaire types:

      BITSET          standaard settype
      BOOLEAN         waar/niet waar
      CHAR            character
      CARDINAL        0, 1, 2, ..., 65535
      INTEGER         -32768, ..., 0, ..., 32767
      LONGINT
      REAL            single precision floating point (6 cijfers)
      LONGREAL        double precision floating point (14 cijfers)

      Voorbeelden van simple types:

      subrange:    IndexType   = CARDINAL [1..10];
      enumeration: StatusType  = (Slecht, Matig, Redelijk, Goed);

      Voorbeelden van gestructureerde types:

      record:      PatientType = RECORD
                                   Temperatuur: REAL;
                                   Bloeddruk  : REAL;
                                 END;
      array:       LijstType   = ARRAY IndexType OF PatientType;
      set:         Verzameling = SET OF IndexType;

      Verder zijn er nog pointertypes en procuduretypes, maar daar
      kom ik  in een  later deel  van de  cursus nog  wel eens  op
      terug.


                            F U N C T I E S

      In Pascal ziet een functie er bijvoorbeeld als volgt uit:

      FUNCTION Kwadraat(x: REAL): REAL;

      BEGIN
              Kwadraat := x * x;
      END;

      In Modula-2 wordt dit:

      PROCEDURE Kwadraat(x: REAL): REAL;

      BEGIN
              RETURN x * x;
      END Kwadraat;

      Er zijn 3 belangrijke verschillen:

      1) PROCEDURE in plaats van FUNCTION
      2) RETURN in plaats van functienaam :=
      3) Bij een Modula-2 functie staan altijd haakjes, ook als er
         geen parameters zijn!

      Met  RETURN wordt  ook meteen  de functie  be�indigd, RETURN
      zonder  iets  erachter kan  in een  gewone procedure  worden
      gebruikt om uit de procedure te springen.


                            M C C A R T H Y

      Modula-2 gebruikt  McCarthy evaluatie  bij het evalueren van
      boolean  expressies.  Dit  komt  erop  neer  dat  de boolean
      expressie  niet verder  wordt ge�valueerd  dan nodig  is. In
      Pascal   wordt   de   boolean   expressie  altijd   helemaal
      ge�valueerd!

      McCarthy evaluatie heeft geen nadelen, de voordelen zijn dat
      het  sneller  is en  dat onderstaand  statement altijd  goed
      gaat:

      IF (n = 0) OR (a / n > 10) THEN ...

      Bij Turbo  Pascal gaat dit fout, want bij het uitrekenen van
      a  / n  wordt er door 0 gedeeld! Bij Modula-2 gaat het goed,
      want  als  n  gelijk  is aan  0 dan  wordt a  / n  niet meer
      uitgerekend!


                              S T R E N G

      Modula-2 is  strenger bij  de controle  op types.  Operaties
      zoals  aftrekken, vermenigvuldigen,  etc. mogen  alleen maar
      worden gedaan op gelijke types!!!

      Het onderstaande mag dus niet!

      VAR
              x: INTEGER;
              y: CARDINAL;

              WRITE(x*y);


                           T E N S L O T T E

      Dit  waren in  het kort  de belangrijkste verschillen tussen
      Turbo Modula-2 en Turbo Pascal. De volgende keer ga ik vanaf
      het   begin   beginnen   met   een   cursus   gestructureerd
      programmeren in Modula-2.

      Tot dan!
                                                      Stefan Boer