Function
Une function Touba calcule une valeur pure. Elle sert à garder la logique métier simple dans le langage, sans handler hôte.
Une function peut utiliser les expressions natives : arithmétique, booléens, comparaisons, concaténation texte, rendu explicite text(expr) et accès à des champs.
Elle ne produit pas d’effet externe :
- pas de réseau ;
- pas de lecture de fichier ;
- pas d’accès direct à un secret ;
- pas de
showouask; - pas de validation humaine ;
- pas de mutation ou réassignation.
Forme
function Name
takes input as InputType
gives OutputType
do
give expression
Avec une valeur locale immuable :
function Name
takes input as InputType
gives OutputType
do
bind local_name as OutputType = expression
give local_name
define nomme une constante de module non sensible. bind nomme une valeur locale immuable dans un bloc.
Chaque appel possède sa propre portée : paramètres, bind et résultats into
ne remplacent pas les valeurs homonymes de l'appelant. Le résultat retourné
est transmis explicitement ; les autres valeurs locales restent dans l'appel.
Cette isolation vaut aussi pour les fonctions importées et reste assurée en
cas d'échec. Une fonction ne capture pas les variables locales de son appelant.
Cas simple
module examples.function_simple
function BuildGreeting
takes name as Text
gives Text
do
give "Bonjour " ++ name
Ici, Touba n’a besoin ni de manifest ni de handler. Le calcul reste dans l’AIR et peut être exécuté par le runtime.
Cas avancé
module examples.function_advanced
define RiskLimit as Float = 0.7
define FileLimit as Int = 20
type ReviewSignal
risk is Float
file_count is Int
has_secret_change is Boolean
function ShouldEscalate
takes signal as ReviewSignal
gives Boolean
do
bind risky as Boolean = signal.risk >= RiskLimit
bind large_change as Boolean = signal.file_count > FileLimit
give risky or large_change or signal.has_secret_change
function BuildReviewLabel
takes signal as ReviewSignal
gives Text
do
ShouldEscalate
with signal as signal
into escalate
if escalate
give "human review required"
else
give "automatic path accepted"
Ce cas montre deux points :
- une
functionpeut appeler une autrefunctionavecwith/into; - le compilateur vérifie que la condition
ifreçoit unBoolean.
Contrôles et valeurs métier
if / else if / else, for et while se composent dans les fonctions,
skills et stratégies. Les liaisons restent immuables et locales à leur bloc ;
une boucle n'ajoute pas d'affectation mutable. Un give retourne immédiatement
la valeur du chemin courant, y compris depuis une boucle.
module examples.ticket_priority
enum Priority
normal
watch
urgent
function FirstContact
takes contacts as List of Optional of Text
gives Optional of Text
do
for contact in contacts
if present contact as address
if address != ""
give some(address)
give none(Text)
function ClassifyTicket
takes overdue_days as Int
gives Priority
do
if overdue_days >= 7
give Priority.urgent
else if overdue_days >= 3
give Priority.watch
else
give Priority.normal
Priority est un type nominal fermé, pas un texte libre. Optional of Text
distingue absence et texte vide ; if present extrait la valeur seulement dans
sa branche. À la frontière JSON, l'énumération utilise "urgent", "watch" ou "normal"
et l'optionnel {"present":false} ou {"present":true,"value":"a@example.test"}.
Voir la référence syntaxe pour les règles de
boucles, d'imports de types et de construction des records. parallel s'écrit
dans une skill ou une stratégie, pas dans une fonction pure.
Ce que la function absorbe
Dans du code hôte classique, un calcul métier simple peut se retrouver dans un handler, un helper JavaScript ou un script annexe.
Avec function, ce calcul reste dans le contrat Touba. Cela rend plus visible ce qui est pur et ce qui doit passer par un tool.
Contrat runtime
- Pas de variables mutables.
- Pas de conversion implicite vers
Text. - Pas de rendu texte de types structurés, listes, secrets ou mémoires.
- La bibliothèque standard riche appartient aux extensions de langage.
- Pas de code hôte inline.
La pureté est contrôlée à la compilation et à l’admission de l’AIR. Une fonction doit référencer son propre graphe et ses appels doivent résoudre des fonctions déclarées. Un graphe forgé contenant un tool, un agent, une interaction ou une validation humaine est refusé avant exécution. L’import d’une fonction pure ne lui confère aucune autorisation supplémentaire.