COMAL/syntaks

Fra DDHFwiki
Spring til navigation Spring til søgning

Det er blevet fortalt mange gange at Børge Christensen opfandt COMAL fordi han fandt BASIC mangelfuld. Her har vi rekonstrueret den samme oplevelse med den BASIC, der blev brugt på RC7000 i midten af halvfjerdserne, og viser samtidig hvordan det samme problem kunne være skrevet i COMAL.

Sammenligning

Dette afsnit viser kildeteksten til et simpelt program, som beregner den decimale værdi fra et hexadecimalt input. Programmet stopper når det når til enden af strengen eller det første tegn, som ikke er et hexadecimalt ciffer.

DataGeneral Extended BASIC
5 DIM H$(20), C$(1)
10 INPUT "Indtast et hexadecimalt nummer";H$
20 R=0
30 FOR I=1TO LEN(H$)
40 C$ = H$(I, I)
50 IF C$ < "0" OR C$ > "9" THEN 80
60 R = R*16+ASC(C$)-ASC("0")
70 GOTO 140
80 IF C$ < "A" OR C$ > "F" THEN110
90 R= R*16+ASC(C$)-ASC("A")+10
100 GOTO 140
110 IF C$ < "a" OR C$ > "f" GOTO 160
120 R = R*16+ASC(C$)-ASC("a")+10

140 NEXT I

160 PRINT "Decimalt resultat: ";R
UniComal Commodore-64 COMAL 80 rev 2.01
0005 DIM h$ OF 20,c$ OF 1
0010 INPUT "Indtast et hexadecimalt nummer": h$
0020 r:=0
0030 FOR i:=1 TO LEN(h$) DO
0040   c$:=h$(i:i)
0050   IF c$>="0" AND c$<="9" THEN
0060     r:=r*16+ORD(c$)-ORD("0")
0070   ELIF c$>="A" AND c$<="F"
0080     r:=r*16+ORD(c$)-ORD("A")+10
0090   ELIF c$>="a" AND c$<="f"
0100     r:=r*16+ORD(c$)-ORD("a")+10
0110   ELSE
0120     GOTO udhop
0130   ENDIF
0140 ENDFOR i
0150 udhop:
0160 PRINT "Decimalt resultat: ";r


Forskelle

Her er de ændringer, som blev indført i COMAL for at gøre det nemmere at lære:

  • COMAL80 formatterer koden for brugeren og laver automatisk indrykning, samt fjerner mellemrum i udtryk. En typisk elevopgave i BASIC ville have meget inkonsistent brug af mellemrum, og ofte så få som muligt. Det opstår pga. de utallige omskrivninger der foretages under programmeringen.
  • Der er fler-linjers IF sætninger med ELSE, ELIF og ENDIF. Data General Extended BASIC har ikke en 'ELSE' kommando. Man kan heller ikke have flere sætninger på samme linje. I praksis må man bruge GOTO
  • Flertydigheden i dimensionering af længden på strenge er blevet fjernet. I BASIC bruges DIM A(10) til at definere en tabel med 10 elementer af tal, hvorimod DIM A$(10) dimensionerer en streng på maks. 10 tegn.
  • GOTO går ikke til et linje nr., men til en mærkat. I BASIC er alle linjer et potentielt gå-til punkt, hvilket gør det væsentligt sværere at gennemgå.
  • NEXT er blevet erstattet med ENDFOR for at være konsistent med ENDCASE, ENDIF, ENDWHILE og andre flerlinjers ordrer.

De fleste ældre programmører vil være bedst bekendt med Microsoft BASIC. Denne variant har nogle forskelle i forhold til den Data General BASIC, som Børge Christensen oplevede da han opfandt COMAL.

DataGeneral Extended BASIC Microsoft BASIC
H$(I,J) MID$(H$, I, J-I+1)