2.18        COMAL

COMAL (COMmon Algorithmic Language) ha origine nel 1973 in Danimarca ad opera di Benedict Loefstedt e Borge Christensen, a partire dai sorgenti di un interprete Basic, con lo scopo di renderlo strutturato, e di dotarlo di funzioni e procedure. Ebbe un certo successo commerciale con diffusione su BBC Microcomputer, Tiki 100, Commodore 64 e IBM PC. Attualmente ne esiste una versione Open Source per gli ambienti Unix, Dos e Windows.

Ha molte somiglianze con MSDOS BASICA, a cominciare dall’ambiente interpretato ed i relativi comandi.

Accetta variabili ed array di numeri interi e floating point, e stringhe di lunghezza variabile. Rispetto a BASICA introduce comandi per la programmazione strutturata: CASE, LOOP, REPEAT ... UNTIL, WHILE espressione DO ..., funzioni, anche ricorsive, e procedure.

       80 PRINT "Immettere Numero";

       90 INPUT num

      100 PRINT "Fattoriale di ",num," : ",Fatt(num)

      150 PRINT num,"^4 : ",Pot(num,4)

      200 END

      600 FUNC Fatt(n) CLOSED

      610 IF n = 1 THEN RETURN 1

      620 RETURN n*Fatt(n-1)

      660 ENDFUNC

      700 FUNC Pot(n,m) CLOSED

      710 IF m = 1 THEN RETURN n

      720 RETURN n*Pot(n,m-1)

      760 ENDFUNC

$ enter "f.txt

$ run

Immettere Numero? 5

Fattoriale di 5 : 120

5^4 : 625

$ run

Immettere Numero? 7

Fattoriale di 7 : 5040

7^4 : 2401

$

$ è il prompt dell’interprete.

Fra le altre minori divergenze dal BASIC, il simbolo di assegnazione e l’indicazione delle sottostringhe: stringa$(inizio:fine)

$ a$:="El Condor pasa"

$ print a$(4:9)

Condor

L’esempio che segue effettua la crittografazione di un testo col metodo della doppia chiave (v. par. 4.3.2 ).

       10 // COMAL (version 0.2.6; Win32)

       20 // (c) Copyright 1992-2002  Jos Visser <josv@osp.nl>

       30 // Crittografia a doppia serratura

       40 PAGE // pulizia video

       60 // numeri primi q: ll area da criptare, p e p1 per criptare

       70 q:=29; p:=31; p1:=37

       80 PRINT "Immettere testo (ll < 30) ";

       90 INPUT testo$

      100 IF Len(testo$) = 0 THEN testo$:="CONDOR INFORMATIQUE - TURIN"

      105 IF Len(testo$) > q THEN

      110   testo$:=testo$(1:29)

      115 ELSE

      120   testo$:=testo$+SPC$(q-LEN(testo$))

      125 ENDIF

      130 PRINT testo$,CHR$(9)," originale"

      150 // crittazione con utilizzo di p

      170 testo$:=Cript$(testo$,p,q)

      250 // crittazione con utilizzo di p1

      270 testo$:=Cript$(testo$,p1,q)

      300 // eliminazione della crittazione con p

      360 testo$:=Decript$(testo$,p,q)

      400 // eliminazione della crittazione con p1

      460 testo$:=Decript$(testo$,p1,q)

      510 END

      600 FUNC Cript$(arc$,p,q) CLOSED

      610 ar$:=SPC$(LEN(arc$))

      615 FOR i:=1 TO LEN(arc$) DO

      620   j:=1+((i-1)*p MOD q)

      630   ar$(j:j):=arc$(i:i)

      640 ENDFOR i

      645 PRINT ar$,CHR$(9)," crittografato con: ",p

      650 RETURN ar$

      660 ENDFUNC

      700 FUNC Decript$(arc$,p,q) CLOSED

      710 ar$:=SPC$(LEN(arc$))

      715 FOR i:=1 TO LEN(arc$) DO

      720   j:=1+((i-1)*p MOD q)

      730   ar$(i:i):=arc$(j:j)

      740 ENDFOR i

      745 PRINT ar$,CHR$(9)," decrittografato con: ",p

      750 RETURN ar$

      760 ENDFUNC

 

Immettere testo (ll < 30) ? ""

CONDOR INFORMATIQUE - TURIN      originale

CIOQNUDEO R-  ITNUFROIRNM A T    crittografato con: 31

C-RNTAORI NUN  OO MDUTRIQI EF    crittografato con: 37

CRTOINN OMURQ F-NAR U O DTIIE    decrittografato con: 31

CONDOR INFORMATIQUE - TURIN      decrittografato con: 37

$

Immettere testo (ll < 30) ? Paragrafo 2.19 COMAL

Paragrafo 2.19 COMAL             originale

PCaOrMaAgLr a f o   2 . 1 9      crittografato con: 31

P .r 9g Ca Mo L2a 1a  r Of A     crittografato con: 37

P. gC oLa1 rO   r9 aM 2 a  fA    decrittografato con: 31

Paragrafo 2.19 COMAL             decrittografato con: 37

$