ABC

Nel 1986 al CWI, l’istituto nazionale di ricerca per la matematica e le scienze del computer olandese, Eddy Boeve, Frank van Dijk, Leo Geurts, Timo Krijnen, Lambert Meertens, Steven Pemberton e Guido van Rossum implementarono ABC con l’ambizione di farne un sostituto del Basic. Le prime versioni di ABC avevano nome B (da non confondere con il B predecessore del C v. par. 2.12.1), la versione attuale è la IV.

ABC è un linguaggio semplice, interattivo con sintassi guidata. ABC opera in spazi di lavoro, di fatto sono directory di disco, in cui mantiene persistentemente dati e funzioni.

Il linguaggio dispone di cinque tipi di dato, che riconosce dal contesto in cui sono usati:

·  Numeri. Sono di due tipi, esatti ed approssimati, il primo tipo è memorizzato come una coppia di interi, numeratore e denominatore. Le funzioni sui numeri sono numerose, fra queste /* e */ forniscono i due valori associati ai numeri esatti:

>>> PUT 10.23 IN x

>>> WRITE */x, /*x, x

1023 100 10.23

·  Stringhe. Sono relativamente povere di funzioni ed operatori, in particolare ^ (str1^str2) unisce due stringhe, @ (str@n) produce la sottostringa senza i primi n-1 caratteri, | (str|n) produce la sottostringa con i primi n caratteri, <<, >< e >> trasformano una variabile in stringa di una assegnata dimensione, inserendola rispettivamente a sinistra, al centro, a destra:

>>> WRITE ".."^(123>>5)^".."

..  123..

·  Compounds o records. Sono insiemi di campi, accessibili tramite assegnazione ad un corrispondente numero di variabili; ad esempio la funzione now fornisce un record con le sei componenti dell’attuale data e ora:

HOW TO RETURN oggi:

   PUT now IN anno, mese, giorno, ora, minuto, secondo

   PUT '  genfebmaraprmaggiulugagosetottnovdic'@(mese*3)|3 IN mm

   RETURN (giorno<<2) ^ " " ^ mm ^ (anno>>5)

>>> WRITE oggi

9  ott 2002

·  Liste. Insiemi ordinati di dati omogenei; la posizione di un elemento nelle lista può variare a seguito di inserzioni o rimozioni. L’operatore di range genera una lista: {1..10}; ciò è utile per utilizzare l’istruzione FOR variab che di per se opera solo su liste (gli elementi della lista sono nella variabile locale variab)

·  Tavole. Coppie di informazioni chiave – valore; la funzione keys trasforma le chiavi in una lista ordinata. I valori di una tavola possono essere tipi qualsiasi; le chiavi devono essere dello stesso tipo.

Le variabili all’interno delle funzioni sono locali a meno di dichiarazione share.

I blocchi di programma relativi a istruzioni condizionali o a funzioni, iniziano con : (due punti) e sono  indentate.

HOW TO RETURN oggi:

  ...  vedi esempio precedente

HOW TO RETURN giorno n:

  RETURN '  lunmarmergiovensabdom'@(n*3)|3

HOW TO RETURN str right n:

  RETURN str@(#str-n+1)

La sintassi degli operatori è coerente, gli unari sono prefissi, i binari sono infissi; questa regola vale anche per le funzioni ed i predicati dichiarati, la cui sintassi è rispettivamente:

HOW TO RETURN [vrb] (fnz [vrb]):

HOW TO REPORT [vrb] (fnz [vrb]):

La sintassi per le procedure è: HOW TO NOMEPROCEDURA [param1, param2, ...]:.

Il linguaggio è gradevole da utilizzare, soffre di alcune limitazioni, oltre quelle già accennate: manca l’accesso a funzioni esterne, la gestione di files, la possibilità di inserire commenti, una funzione di valutazione di istruzioni autocostruite, ora limitata a quelle inserite da tastiera tramite l’istruzione: READ nomevariabile EG esempio_di_tipo_di_dato

>>> READ duepi EG 1

2*pi

>>> WRITE "duepigreco =", duepi

duepigreco = 6.283185307179586

Nell’esempio che segue da una tabella con record coppie di città e loro distanza, genera un tabella con chiave città e valore la lista delle città direttamente raggiungibili:

HOW TO NODI:

   SHARE distanze

   PUT {}IN nodi

   FOR i IN keys distanze:

     PUT distanze[i] IN da, a, km

     INSERTNODO nodi, lower da, lower a

     INSERTNODO nodi, lower a, lower da

   WRITE "--- Record distanze ---"/

   DISPLAY distanze

   WRITE "--- Tabella nodi ---"/

   DISPLAY nodi

HOW TO INSERTNODO tab, da, a:

   IF da not.in keys tab:

      PUT {} IN tab[da]

   PUT tab[da] IN lista

   INSERT a IN lista

   PUT lista IN tab[da]

HOW TO DISPLAY tavola:

   FOR chiave IN keys tavola:

      WRITE chiave<<10, tavola[chiave] /

L’esecuzione produce:

>>> NODI

--- Record distanze ---

1          ("Torino", "Milano", 130)

2          ("Torino", "Casale", 60)

3          ("Casale", "Pavia", 40)

4          ("Casale", "Milano", 80)

5          ("Milano", "Mantova", 70)

6          ("Pavia", "Mantova", 50)

7          ("Torino", "Asti", 50)

8          ("Asti", "Casale", 30)

9          ("Asti", "Pavia", 50)

--- Tabella nodi ---

asti       {"casale"; "pavia"; "torino"}

casale     {"asti"; "milano"; "pavia"; "torino"}

mantova    {"milano"; "pavia"}

milano     {"casale"; "mantova"; "torino"}

pavia      {"asti"; "casale"; "mantova"}

torino     {"asti"; "casale"; "milano"}