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 :
tip(bill, pct) = bill * pcttip($48, 15%) donne $7.20tip($120, 12.5%) donne $15.00tip($36 + $12, 15%) donne $7.20La 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.
bmi(weight, height) = weight / height^2bmi(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 :
bmi(weight, height) = (weight / height^2) in kg/m^2bmi(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 :
standard_vat() = 20%£120 * standard_vat() donne £24.00Une 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_payoubmi2. Si vous saisissezarea 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 appelertip($48, 15%). - Chaque paramètre a besoin de son propre nom.
f(a, a) = aest 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) = …ousqrt(x) = …affiche une erreur au lieu de la remplacer. Une simple variable peut toutefois porter l’un de ces noms, commefloor = 12 m²; voir Noms. - Les noms courants dans les tableurs,
avg,totaletstdev, restent disponibles. Si vous définissez votre propretotal(order), c’est votre version qui s’exécute. - Une fonction et une variable peuvent partager un nom.
ratelit la variable etrate(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,maxetmin, 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 :
tip(bill, pct) = bill * pcttip($1,200, 15%) donne $180.00tip($1200,15%) donne $180.00Si 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 :
vat = 20%with_vat(price) = price * (1 + vat)with_vat(£50) donne £60.00vat = 5%with_vat(£50) donne £52.50La 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 :
price = £10double(price) = price * 2double(£3) donne £6.00price donne £10.00Comme 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 :
day_rate = £400fee(days) = days * day_rateinvoice(days) = fee(days) * 1.2invoice(5) donne £2,400.00Une 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 :
shipping(order) = £4.95total(order) = order + shipping(order)shipping(order) = £2.95total(£30) donne £34.95shipping(£30) donne £2.95Pour 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.
checkout(order) = order + delivery(order)delivery(order) = if order >= £40 then £0 else £3.50checkout(£25) donne £28.50checkout(£60) donne £60.00Conditions
Utilisez if … then … else … pour choisir entre plusieurs résultats. Ajoutez un autre if après else pour traiter plus de deux cas :
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20postage(90 g) donne £0.85postage(500 g) donne £1.55postage(1.2 kg) donne £3.20Seule la branche correspondant à la condition est évaluée. Vous pouvez ainsi éviter un calcul qui échouerait, comme une division par zéro :
per_person(total, people) = if people > 0 then total / people else £0per_person(£90, 3) donne £30.00per_person(£90, 0) donne £0.00Ré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 :
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)handshakes(6) donne 15handshakes(10) donne 45Chaque 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 :
spread(scores) = max(scores) - min(scores)spread([12, 18, 9, 21]) donne 12Le 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é : dansw / h²,h²signifie des heures au carré et ne désigne pas le paramètreh. Écrivezw / 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
tipcontient une erreur, la ligne la signale et la dernière version valide detipreste disponible. - Les résultats peuvent changer au recalcul de la note. Chaque appel est évalué à nouveau : une fonction utilisant
randomou 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 :
# March invoiceday_rate = £450vat = 20%fee(days) = days * day_ratewith_vat(amount) = amount * (1 + vat)late_fee(amount, days_late) = if days_late > 30 then amount * 2% else £0design = fee(8) donne £3,600.00build = fee(4.5) donne £2,025.00subtotal = design + build donne £5,625.00with_vat(subtotal) donne £6,750.00late_fee(with_vat(subtotal), 45) donne £135.00Changez day_rate ou vat et chaque ligne ci-dessous se met à jour. Lorsque le client paie en retard, un appel ajoute les frais.