Heroes / Guida / capitolo 1

Un primo programma

Un file e una funzione main: basta questo per iniziare.

Per scrivere il tuo primo programma Heroes basta un file con una funzione main. Non servono file di progetto né librerie da importare per stampare un risultato.

Il programma, tutto quanto

function main()
    print((2 + 3) * 4)
examples/gallery/00-first.hero, righe 7–8
$ heroes run examples/gallery/00-first.hero
20

function main() definisce il punto di partenza del programma. Non riceve argomenti e non restituisce un valore, quindi dopo le parentesi non compare un tipo di ritorno. Una funzione che restituisce un numero intero lo indica con -> i64. print è una funzione predefinita: stampa gli argomenti uno dopo l’altro, poi va a capo.

Che cosa non c’è, in quel file

Il file contiene solo il codice necessario al programma. Queste regole riducono le informazioni da cercare altrove:

L’indentazione è la struttura

Ogni blocco richiede un rientro di quattro spazi rispetto alla riga che lo apre. La regola vale a ogni livello. Un rientro diverso produce questo errore:

$ heroes check hello.hero
error[indentation_not_multiple_of_4]: indentation must be exactly 4 spaces per level; found 2
  at hello.hero:2:1
    |
  2 |   print("hi")
    | ^^

Anche i tab producono un errore, con un messaggio specifico. Un rientro uniforme rende più facile confrontare due versioni dello stesso file. heroes fmt stampa il codice nel formato standard del linguaggio. I file già formattati restano identici, byte per byte.

La regola è più vecchia di quanto sembri. Non l’ha inventata Python: l’ha presa da ABC, un linguaggio didattico nato nello stesso laboratorio, e lo dice Guido van Rossum in persona nella documentazione di Python, dove chiama ABC l’origine di molte caratteristiche di Python, compreso l’uso dell’indentazione per raggruppare le istruzioni. Heroes prende la stessa idea e la rende più rigida, perché una regola con una sola grafia è una regola che un modello non può sbagliare di poco: esattamente quattro spazi, mai un tab.

La documentazione sta nei commenti

La documentazione si scrive nei commenti. # inizia un commento che termina a fine riga e può contenere Markdown, un formato testuale per titoli, elenchi e altri elementi. ## apre una sezione:

## Points
#
# Records, their constructors, and UFCS. Every field is named at the call
# site, always — `Point(3, 4)` does not exist.
examples/gallery/01-points.hero, righe 1–4

Un commento subito sopra una dichiarazione la documenta, senza altri simboli:

# A position on the integer grid.
record Point
    x: i64
    y: i64
examples/gallery/01-points.hero, righe 6–9

Un file è un modulo

Quando ti servono più file, puoi organizzarli in moduli. use rende disponibile un altro modulo:

use eval
examples/calculator/main.hero, riga 31

Questa riga associa il nome eval al file eval.hero nella stessa cartella. Per usare una sua funzione, aggiungi quel nome davanti: eval.calculate(text, env). Ogni modulo richiede una riga use; non esiste un import con l’asterisco per importare tutti i nomi insieme. Puoi rinominare un modulo con as, come mostra il capitolo 12. Il prefisso e la riga use indicano sempre quale file consultare.

I verbi

Il comando heroes comprende questi sottocomandi, ciascuno con una funzione precisa:

$ heroes check program.hero    # nomi e tipi, senza produrre un binario
$ heroes run program.hero      # compila ed esegue
$ heroes build program.hero    # compila e basta
$ heroes test program.hero     # esegue i test del file
$ heroes fmt program.hero      # stampa la forma canonica

I test fanno parte del linguaggio. Il file dei punti mostrato sopra ne contiene due:

$ heroes test examples/gallery/01-points.hero
ok   "the 3-4-5 triangle"
ok   "a rectangle keeps its size when it moves"
2 tests, all passed

Poi: Errori, dove impari a raggruppare i dati e a nominare gli argomenti delle chiamate. Torna all’elenco dei capitoli.

Esegui un programma tuo: bastano quattro comandi. Oppure prendi tutto il linguaggio in un file solo, e tutti i programmi già scritti.