Aller au contenu principal
Version: 1.0.0

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 show ou ask ;
  • pas de validation humaine ;
  • pas de mutation ou réassignation.

Forme​

source.tb
function Name
takes input as InputType
gives OutputType
do
give expression

Avec une valeur locale immuable :

source.tb
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​

function_simple.tb
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é​

function_advanced.tb
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 function peut appeler une autre function avec with / into ;
  • le compilateur vérifie que la condition if reçoit un Boolean.

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.

ticket_priority.tb
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.

Parcours dédiés​