Valeurs immuables avec define et bind
Objectif : nommer des valeurs sans introduire de mutation ni déplacer la logique pure dans un handler.
Syntaxe
Constante de module :
define Name as Type = literal
Valeur locale dans un bloc :
bind name as Type = expression
define est visible dans le module. bind est visible seulement dans le flux où il est déclaré.
Exemple
module examples.review_score
define ScoreLimit as Float = 0.75
define AcceptedLabel as Text = "accepted"
define ReviewLabel as Text = "review"
function ReviewScore
takes score as Float
takes bonus as Float
gives Text
do
bind adjusted as Float = (score + bonus) / 2.0
bind accepted as Boolean = adjusted >= ScoreLimit
if accepted
give AcceptedLabel
else
give ReviewLabel
Compiler
touba compile review-score.tb --out review-score.air.json
L’AIR contient :
- les constantes dans
definitions.constants; - les calculs purs dans les expressions AIR ;
- les valeurs locales
bindcomme nœuds de graphe.
Exécuter
touba run review-score.air.json --inputs-json '{"score":1.0,"bonus":0.8}' --output result
Sortie attendue :
"accepted"
La sortie est une chaîne JSON, guillemets compris. Les champs d’entrée invalides, absents ou supplémentaires sont refusés avant l’exécution. Vérifiez le refus de typage sans modifier le programme :
if touba run review-score.air.json --inputs-json '{"score":"invalid","bonus":0.8}' --output json; then
exit 1
else
test "$?" -eq 1
fi
Erreurs utiles
Cette constante est refusée :
define BaseScore as Float = 0.5
define ScoreLimit as Float = BaseScore + 0.25
La raison : define accepte seulement des littéraux. Le calcul doit vivre dans une function ou dans un bind local.
Cette valeur locale est refusée :
bind accepted as Boolean = title
La raison : le type déclaré est Boolean, mais l’expression produit ici un Text.
À retenir
Utilisez define pour des seuils ou libellés non sensibles. Utilisez bind pour rendre un calcul local lisible et traçable.
N’utilisez pas define pour une clé API, un jeton, une variable d’environnement ou une valeur différente selon l’environnement d’exécution.