Spring naar inhoud
Varlig-handleiding
Varlig-startpagina

Je eigen functies

Typ je dezelfde formule steeds met andere getallen, maak er dan een functie van. Je benoemt formule en invoer eenmaal en roept haar overal aan: voor fooien, BMI, spaargroei of facturen.

Deze pagina behandelt functies definiëren en aanroepen, andere namen gebruiken, voorwaarden, recursie en geldende limieten. Voor ingebouwde functies zoals sqrt en round zie de functiereferentie.

Een functie definiëren en aanroepen

Schrijf de functienaam, parameters tussen ronde haakjes, een gelijkteken en de formule. Roep haar daarna aan met waarden in dezelfde volgorde:

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

De definitieregel toont geen resultaat. Elke aanroep vervangt bill en pct door je waarden en berekent de formule. Een argument mag een hele berekening zijn, zoals $36 + $12 hierboven.

Argumenten zijn volledige waarden, niet alleen getallen. Eenheden en valuta blijven dus in de formule behouden:

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

Eenheden blijven zoals je ze invoert: bmi(81 kg, 180 cm) geeft kg/cm². Reken binnen de functie om als je ongeacht de invoer dezelfde eenheid wilt:

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

Een functie mag ook geen parameters hebben. Schrijf dan lege haakjes bij zowel definitie als aanroep:

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

Een gewone variabele zoals standard_vat = 20% doet meestal hetzelfde met minder typwerk.

Namen en parameters

  • Functie- en parameternamen zijn één woord. Gebruik letters, cijfers en underscores zonder spaties, zoals net_pay of bmi2. Schrijf je area of circle(r) = pi * r^2, dan stelt de regel de juiste naam voor: area_of_circle.
  • Functienamen zijn niet hoofdlettergevoelig: na Tip(bill, pct) kun je tip($48, 15%) aanroepen.
  • Elke parameter moet een eigen naam hebben. f(a, a) = a is een fout.
  • Een functie mag maximaal 32 parameters hebben.
  • Je kunt de naam van een ingebouwde functie niet hergebruiken. round(x) = … en sqrt(x) = … geven een fout in plaats van die functie te vervangen. Een gewone variabele mag zo’n naam wel gebruiken, zoals floor = 12 m². Zie Namen.
  • De spreadsheetnamen avg, total en stdev mag je vrij gebruiken. Definieer je zelf total(order), dan wordt jouw versie uitgevoerd.
  • Een functie en variabele mogen dezelfde naam hebben. rate leest de variabele; rate(5) roept de functie aan.
  • Roep een functie altijd met ronde haakjes aan. Een losse functienaam zonder gelijknamige variabele toont niets. Uitzonderingen zijn sum, total, subtotal, grand total, average, max en min, die deze statistiek voor de regels erboven berekenen. Zie Bovenstaande regels optellen.

Komma’s in argumenten

Een komma gevolgd door een spatie scheidt argumenten; een komma gevolgd door precies drie cijfers groepeert duizendtallen. Zo kun je bedragen op de gebruikelijke manier schrijven:

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

Heeft een functie meer waarden nodig dan de spaties opleveren, dan scheidt elke komma argumenten, zoals in de tweede aanroep. Gebruik een decimale punt voor gebroken getallen, zoals tip($48, 12.5%).

Andere namen uit je notitie gebruiken

Een functie kan variabelen uit je notitie gebruiken. Ze leest hun huidige waarde bij elke aanroep:

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

De variabele moet al bestaan als je de functie definieert. Zet vat = 20% dus boven with_vat. Bestaat de variabele nog niet, dan geeft de definitieregel een fout.

Parameters zijn lokaal voor de functie. Een parameter price leest of verandert geen variabele price elders in de notitie:

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

Net als variabelen kunnen functies uit een rekenblok in latere rekenblokken van dezelfde notitie worden gebruikt. Varlig werkt van boven naar beneden; definieer een functie dus boven de eerste aanroep. Een aanroep boven de definitie toont geen resultaat.

Functies die andere functies aanroepen

Kleine functies kunnen op elkaar voortbouwen:

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

Een functie onthoudt de versie van een hulpfunctie die bij haar definitie bestond. Definieer je die hulpfunctie lager opnieuw, dan blijven eerder gedefinieerde functies de oude versie gebruiken:

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

Definieer total opnieuw onder de nieuwe shipping om die versie te gebruiken. Een bestaande definitie ter plekke bewerken veroorzaakt dit niet: Varlig rekent vanaf boven opnieuw en alles eronder gebruikt de gewijzigde versie.

Een functie mag ook een pas later gedefinieerde hulpfunctie aanroepen. Ze gebruikt dan de versie die op het moment van aanroepen bestaat. De hulpfunctie moet dus bestaan wanneer je de buitenste functie aanroept:

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

Voorwaarden

Gebruik if … then … else … om tussen resultaten te kiezen. Zet na else nog een if voor meer dan twee gevallen:

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

Alleen de toepasselijke tak wordt berekend. Zo voorkom je een berekening die anders faalt, zoals delen door nul:

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

Recursie

Een functie mag zichzelf aanroepen zolang een voorwaarde haar uiteindelijk stopt. Deze telt handdrukken wanneer iedereen in een groep elkaar eenmaal de hand geeft:

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

Elke aanroep nestelt één niveau dieper; maximaal 12 geneste aanroepen zijn toegestaan. handshakes(12) werkt nog, maar handshakes(13) geeft Error: calculation limit. Een functie zonder bereikbare stopvoorwaarde wordt bij definitie geaccepteerd en loopt bij aanroepen tegen dezelfde limiet. Twee functies mogen elkaar ook aanroepen, binnen die limiet.

Voor gewone telproblemen zijn ingebouwde functies sneller en geldt die limiet niet. combination(10, 2) geeft ook 45; factorial(n) of n! dekt het klassieke recursievoorbeeld.

Lijsten, matrices en meer

Argumenten mogen lijsten, matrices of complexe getallen zijn. De functiedefinitie mag elke ingebouwde functie gebruiken:

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

De definitie mag ook een sommatie of vergelijkingsoplosser met een eigen lokale variabele bevatten. Zie Lijsten en statistiek en Sommatie, vergelijkingen en calculus.

Valkuilen

  • Schrijf machten met ^. x² wordt binnen een functie niet geaccepteerd. Bovendien kan een korte parameternaam een eenheid zijn: in w / h² betekent h² vierkante uren, niet de parameter h. Schrijf w / h^2.
  • Controleer het aantal argumenten. tip($48) aanroepen terwijl de functie twee waarden verwacht geeft een fout.
  • Een losse prijs wordt als prijs per eenheid gelezen. In oats(amount) = amount / 1 kg * £0.95 is £0,95 een kiloprijs. Elke aanroep meldt dat; houd de aanwijzer erboven voor de uitleg dat £0,95 in oats als prijs per kg is behandeld en £0.95/kg dit expliciet maakt. Schrijf het tarief volledig in de definitie om de melding weg te nemen.
  • Eén regel, één formule. Een definitie is één uitdrukking op één regel. Definieer bij meerdere stappen een kleine functie per stap en combineer ze.
  • Een ongeldige herdefinitie behoudt de oude versie. Bevat een nieuwe definitie van tip een fout, dan meldt de regel dat en blijft de vorige werkende tip beschikbaar.
  • Resultaten kunnen bij herberekenen veranderen. Elke aanroep wordt opnieuw berekend. Een functie met random of de datum van vandaag kan dus een ander resultaat geven.
  • Fouten worden doorgegeven. Laat een argument de formule mislukken, bijvoorbeeld door delen door nul, dan toont de aanroep die fout.

Limieten

Onderdeel Limiet
Parameters per functie 32
Geneste aanroepen (een functie die zichzelf of een andere aanroept) 12
Aanroepen tijdens het uitwerken van één aanroep op het hoogste niveau 16,384
Functies die in een notitie zijn gedefinieerd 1,024

Bij een overschreden limiet verschijnt Error: calculation limit. De rest van de notitie blijft werken. Zie Fouten, diagnostiek en limieten voor alle limieten.

Alles combineren

Hier staat een freelancefactuur. Tarief en btw staan bovenaan als benoemde waarden; drie kleine functies doen het rekenwerk:

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) geeft £3,600.00
build = fee(4.5) geeft £2,025.00
subtotal = design + build geeft £5,625.00
with_vat(subtotal) geeft £6,750.00
late_fee(with_vat(subtotal), 45) geeft £135.00

Verander day_rate of vat en alle regels eronder worden bijgewerkt. Betaalt de klant te laat, dan voegt één aanroep de toeslag toe.