Passer au contenu
Guide Varlig
Accueil Varlig

Vos propres fonctions

Si vous ressaisissez souvent la même formule avec des nombres différents, transformez-la en fonction. Définissez une fois son nom et ses paramètres, puis appelez-la chaque fois que nécessaire : calcul de pourboire ou d’IMC, projection d’épargne, facture…

Cette page explique comment définir et appeler des fonctions, utiliser les autres valeurs nommées de la note, écrire des conditions et des appels récursifs, ainsi que les limites applicables. Pour les fonctions intégrées à Varlig, comme sqrt et round, consultez la référence des fonctions intégrées.

Définir et appeler une fonction

Écrivez le nom de la fonction, ses paramètres entre parenthèses, un signe égal et la formule. Appelez ensuite la fonction avec les valeurs dans le même ordre :

calc
tip(bill, pct) = bill * pct
tip($48, 15%) donne $7.20
tip($120, 12.5%) donne $15.00
tip($36 + $12, 15%) donne $7.20

La ligne de définition n’affiche aucun résultat. Chaque appel remplace bill et pct par vos valeurs, puis évalue la formule. Un argument peut être un calcul complet, comme $36 + $12 ci-dessus.

Les arguments sont des valeurs complètes, pas seulement des nombres : leurs unités et devises sont conservées dans le calcul.

calc
bmi(weight, height) = weight / height^2
bmi(81 kg, 1.8 m) donne 25 kg/m²

Les unités sont conservées telles que fournies : bmi(81 kg, 180 cm) donne donc un résultat en kg/cm². Pour obtenir toujours la même unité, quelles que soient les valeurs transmises, effectuez la conversion dans la fonction :

calc
bmi(weight, height) = (weight / height^2) in kg/m^2
bmi(81 kg, 180 cm) donne 25 kg/m²
bmi(80 kg, 5.9 ft) donne 24.7375131668 kg/m²

Une fonction peut aussi ne prendre aucun paramètre. Gardez les parenthèses vides dans sa définition comme dans ses appels :

calc
standard_vat() = 20%
£120 * standard_vat() donne £24.00

Une simple variable, comme standard_vat = 20%, suffit généralement pour cela et demande moins de saisie.

Noms et paramètres

  • Les noms de fonctions et de paramètres s’écrivent d’un seul tenant, sans espaces, avec des lettres, chiffres et traits de soulignement, comme net_pay ou bmi2. Si vous saisissez area of circle(r) = pi * r^2, la ligne suggère le nom à utiliser : area_of_circle.
  • Les noms de fonctions ne distinguent pas majuscules et minuscules : après avoir défini Tip(bill, pct), vous pouvez appeler tip($48, 15%).
  • Chaque paramètre a besoin de son propre nom. f(a, a) = a est une erreur.
  • Une fonction peut avoir jusqu'à 32 paramètres.
  • Vous ne pouvez pas réutiliser le nom d’une fonction intégrée : round(x) = … ou sqrt(x) = … affiche une erreur au lieu de la remplacer. Une simple variable peut toutefois porter l’un de ces noms, comme floor = 12 m² ; voir Noms.
  • Les noms courants dans les tableurs, avg, total et stdev, restent disponibles. Si vous définissez votre propre total(order), c’est votre version qui s’exécute.
  • Une fonction et une variable peuvent partager un nom. rate lit la variable et rate(5) appelle la fonction.
  • Appelez toujours une fonction avec des parenthèses. Un nom de fonction seul n’affiche rien s’il n’existe pas de variable du même nom. Les exceptions sont sum, total, subtotal, grand total, average, max et min, qui effectuent l’opération correspondante sur les lignes précédentes ; voir Additionner les lignes précédentes.

Virgules dans les arguments

Une virgule suivie d’un espace sépare les arguments ; suivie d’exactement trois chiffres, elle sert de séparateur de milliers. Vous pouvez ainsi saisir les montants sous cette forme :

calc
tip(bill, pct) = bill * pct
tip($1,200, 15%) donne $180.00
tip($1200,15%) donne $180.00

Si la séparation par espaces ne fournit pas assez de valeurs à la fonction, chaque virgule devient un séparateur, comme dans le deuxième appel. Utilisez un point comme séparateur décimal, par exemple dans tip($48, 12.5%).

Utiliser d’autres noms définis dans la note

Une fonction peut utiliser les variables de la note. Elle lit leur valeur actuelle à chaque appel :

calc
vat = 20%
with_vat(price) = price * (1 + vat)
with_vat(£50) donne £60.00
vat = 5%
with_vat(£50) donne £52.50

La variable doit déjà exister au moment de définir la fonction : placez donc vat = 20% au-dessus de with_vat. Sinon, la ligne de définition affiche une erreur.

Les paramètres sont locaux à la fonction. Un paramètre nommé price ne lit ni ne modifie une variable nommée price ailleurs dans la note :

calc
price = £10
double(price) = price * 2
double(£3) donne £6.00
price donne £10.00

Comme une variable, une fonction définie dans un bloc de calcul peut servir dans les blocs suivants de la même note. Varlig traite la note de haut en bas : placez donc la définition avant le premier appel. Un appel situé avant la définition n’affiche aucun résultat.

Fonctions appelant d’autres fonctions

Les petites fonctions peuvent s'appuyer les unes sur les autres :

calc
day_rate = £400
fee(days) = days * day_rate
invoice(days) = fee(days) * 1.2
invoice(5) donne £2,400.00

Une fonction conserve la version d’une fonction auxiliaire qui existait lors de sa définition. Si vous redéfinissez cette fonction auxiliaire plus bas, les fonctions définies auparavant continuent d’utiliser l’ancienne version :

calc
shipping(order) = £4.95
total(order) = order + shipping(order)
shipping(order) = £2.95
total(£30) donne £34.95
shipping(£30) donne £2.95

Pour utiliser la nouvelle version de shipping, redéfinissez total en dessous. Modifier directement la définition existante ne produit pas cet effet : Varlig recalcule la note depuis le début, et toutes les lignes suivantes utilisent la version modifiée.

Une fonction peut aussi appeler une fonction auxiliaire définie plus bas. Elle utilise alors la version disponible au moment de l’appel : cette fonction auxiliaire doit donc exister lorsque vous appelez la fonction principale.

calc
checkout(order) = order + delivery(order)
delivery(order) = if order >= £40 then £0 else £3.50
checkout(£25) donne £28.50
checkout(£60) donne £60.00

Conditions

Utilisez if … then … else … pour choisir entre plusieurs résultats. Ajoutez un autre if après else pour traiter plus de deux cas :

calc
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20
postage(90 g) donne £0.85
postage(500 g) donne £1.55
postage(1.2 kg) donne £3.20

Seule la branche correspondant à la condition est évaluée. Vous pouvez ainsi éviter un calcul qui échouerait, comme une division par zéro :

calc
per_person(total, people) = if people > 0 then total / people else £0
per_person(£90, 3) donne £30.00
per_person(£90, 0) donne £0.00

Récursivité

Une fonction peut s’appeler elle-même, à condition qu’un cas d’arrêt soit finalement atteint. Celle-ci compte les poignées de main dans un groupe où chaque personne serre une fois la main de chacune des autres :

calc
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)
handshakes(6) donne 15
handshakes(10) donne 45

Chaque appel ajoute un niveau d’imbrication, avec une limite de 12 appels imbriqués. handshakes(12) fonctionne, mais handshakes(13) affiche Error: calculation limit. Une fonction qui n’atteint jamais son cas d’arrêt est acceptée lors de sa définition, puis rencontre la même limite à l’appel. Deux fonctions peuvent aussi s’appeler mutuellement, dans cette même limite.

Pour les calculs de dénombrement courants, les fonctions intégrées sont plus rapides et n’ont pas cette limite. combination(10, 2) donne également 45, et factorial(n), ou n!, remplace l’exemple classique de récursion.

Listes, matrices et autres types

Les arguments peuvent être des listes, des matrices ou des nombres complexes. Le corps de la fonction peut utiliser toute fonction intégrée :

calc
spread(scores) = max(scores) - min(scores)
spread([12, 18, 9, 21]) donne 12

Le corps de la fonction peut aussi contenir une sommation ou une résolution d’équation avec sa propre variable locale. Voir Listes et statistiques et Sommation, résolution d’équations et analyse.

Pièges à éviter

  • Écrivez les puissances avec ^. x² n’est pas accepté dans une fonction. De plus, un nom de paramètre court peut être interprété comme une unité : dans w / h², h² signifie des heures au carré et ne désigne pas le paramètre h. Écrivez w / h^2.
  • Vérifiez le nombre d’arguments. L’appel tip($48) affiche une erreur si la fonction attend deux valeurs.
  • Un prix seul est interprété comme un prix unitaire. Dans oats(amount) = amount / 1 kg * £0.95, 0,95 £ est interprété comme un prix par kilogramme. Chaque appel le signale ; au survol, l’explication indique : « £0.95 dans oats est interprété comme un prix au kg. Écrivez £0.95/kg à cet endroit pour le préciser. » Écrire explicitement le prix unitaire dans la définition supprime cette indication.
  • Une ligne, une formule. Une définition est une seule expression sur une ligne. Pour un calcul avec plusieurs étapes, définissez une petite fonction pour chaque étape et combinez-les.
  • Une redéfinition erronée conserve l’ancienne version. Si une nouvelle définition de tip contient une erreur, la ligne la signale et la dernière version valide de tip reste disponible.
  • Les résultats peuvent changer au recalcul de la note. Chaque appel est évalué à nouveau : une fonction utilisant random ou la date du jour peut donc donner un nouveau résultat.
  • Les erreurs sont transmises à l’appel. Si un argument fait échouer la formule, par exemple avec une division par zéro, l’appel affiche cette erreur.

Limites

Élément Limite
Paramètres par fonction 32
Appels imbriqués (une fonction appelant elle-même ou une autre) 12
Appels effectués pour évaluer un appel de premier niveau 16,384
Fonctions définies dans une note 1,024

Lorsqu’une limite est atteinte, le résultat affiche Error: calculation limit. Le reste de la note continue de fonctionner. Toutes les limites sont décrites dans Erreurs, diagnostics et limites.

Combiner les opérations

Voici une facture de travail indépendant. Le tarif et la TVA sont définis en haut comme valeurs nommées ; trois petites fonctions effectuent les calculs :

calc
# March invoice
day_rate = £450
vat = 20%
fee(days) = days * day_rate
with_vat(amount) = amount * (1 + vat)
late_fee(amount, days_late) = if days_late > 30 then amount * 2% else £0
design = fee(8) donne £3,600.00
build = fee(4.5) donne £2,025.00
subtotal = design + build donne £5,625.00
with_vat(subtotal) donne £6,750.00
late_fee(with_vat(subtotal), 45) donne £135.00

Changez day_rate ou vat et chaque ligne ci-dessous se met à jour. Lorsque le client paie en retard, un appel ajoute les frais.