Book · Chapter 8

6. Fonctions et procédures

6. Fonctions et procédures

Une fonction est une promesse : « si vous me donnez ces entrées, je vous rends cette sortie ». Dans Vitte, cette promesse se veut simple, lisible, et stable. Une bonne fonction donne envie de la réutiliser.

Définir une procédure

proc add(x: int, y: int) -> int {
  return x + y
}

Le nom est court et précis. Les paramètres sont explicitement typés. La signature est un point de repère important.

Procédures locales

Vitte autorise les procédures comme valeurs, ce qui aide à structurer un code de manière locale :

entry main at core/app {
  let add = proc(x: int, y: int) -> int { return x + y }
  return add(1, 2)
}

Effets et lisibilité

Une procédure qui touche l’extérieur (fichier, réseau, horloge) devrait le dire clairement. Le but est de rendre l’effet visible au lecteur. L’ambiguïté est une source de bugs.

L’interface comme contrat

Une signature simple permet de changer l’implémentation sans toucher aux appelants. Plus votre interface est claire, plus votre code est durable.

Petite taille, grande clarté

Une procédure courte favorise la compréhension locale. Si une fonction devient longue, posez‑vous la question : est‑ce un seul problème ou plusieurs ?

Découper au bon endroit

Le bon découpage n’est pas celui qui minimise les lignes, mais celui qui minimise l’effort de compréhension. Un lecteur doit pouvoir comprendre une procédure sans sauter ailleurs toutes les trois lignes.

À retenir

Les signatures sont des contrats. Une procédure courte vaut mieux qu’une procédure polyvalente. Les effets doivent être visibles.

Exemple guidé : clarifier une interface

Partir d’une procédure “fourre‑tout”, puis découper en trois fonctions claires. Chaque fonction doit tenir en moins de 15 lignes.

Erreurs courantes

Utiliser des paramètres “optionnels” sans le dire. Faire une fonction qui “fait un peu de tout”. Cacher un effet derrière une signature trop neutre.

Checklist procédures

Le nom décrit l’intention. La signature est courte. Les effets sont visibles.

Exercice : réduire la signature

Prenez une procédure avec six paramètres. Essayez de regrouper ceux qui vont ensemble dans un type dédié. La signature devient plus lisible, et les erreurs d’appel sont moins probables.

Code complet (API actuelle)

proc parse_port(s: string) -> i32 {
  let i: i32 = 0
  let n: i32 = 0
  if s.len == 0 { give -1 }
  loop {
    if i >= s.len as i32 { break }
    let ch = s.slice(i as usize, (i + 1) as usize)
    if ch < "0" || ch > "9" { give -1 }
    n = n * 10 + (ch.as_bytes()[0] as i32 - 48)
    i = i + 1
  }
  give n
}

API idéale (future)

Un module std/parse avec parse_i32 et parse_usize standard.