Hoppa till innehåll
Varlig-guiden
Varligs startsida

Dina egna funktioner

Om du skriver samma formel om och om igen med olika tal kan du göra den till en funktion. Du namnger formeln och dess indata en gång och anropar den sedan när du behöver ett resultat: för att räkna ut dricks, kontrollera BMI, beräkna framtida sparande eller skapa en faktura.

Denna sida täcker definition och anrop av funktioner, hur de använder de andra namnen i din anteckning, villkor och rekursion, samt de gränser som gäller. För funktionerna som ingår i Varlig, såsom sqrt och round, se referensen för inbyggda funktioner.

Definiera och anropa en funktion

Skriv funktionens namn, dess parametrar inom parenteser, ett likhetstecken och formeln. Anropa den sedan med värden i samma ordning:

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

Definitionsraden visar inget resultat. Vid varje anrop ersätts bill och pct med dina värden och formeln beräknas. Ett argument kan vara en hel beräkning, som $36 + $12 ovan.

Argument är fullständiga värden, inte bara tal. Därför följer enheter och valutor med genom formeln:

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

Enheterna behålls som du anger dem, så bmi(81 kg, 180 cm) svarar i kg/cm². För att få samma enhet oavsett vad du matar in, konvertera inuti funktionen:

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

En funktion kan också sakna parametrar. Skriv tomma parenteser både när du definierar den och när du anropar den:

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

En vanlig variabel, till exempel standard_vat = 20%, gör oftast samma sak med färre tecken.

Namn och parametrar

  • Funktionsnamn och parameternamn skrivs som ett enda ord. Använd bokstäver, siffror och understreck utan mellanslag, till exempel net_pay eller bmi2. Om du skriver area of circle(r) = pi * r^2 föreslår raden i stället namnet area_of_circle.
  • Funktionsnamn skiljer inte på stora och små bokstäver. Om du definierar Tip(bill, pct) kan du anropa tip($48, 15%).
  • Varje parameter behöver sitt eget namn. f(a, a) = a är ett fel.
  • En funktion kan ha upp till 32 parametrar.
  • Du kan inte återanvända namnet på en inbyggd funktion. round(x) = … eller sqrt(x) = … visar ett fel istället för att ersätta det. En vanlig variabel kan fortfarande använda ett av dessa namn, till exempel floor = 12 m²; se Namn.
  • Namnen avg, total och stdev, som används i kalkylblad, är fria att använda. Definierar du en egen total(order) är det din version som körs.
  • En funktion och en variabel kan dela ett namn. rate läser variabeln och rate(5) anropar funktionen.
  • Anropa alltid funktioner med parenteser. Ett ensamt funktionsnamn visar inget resultat om det inte också finns en variabel med samma namn. Undantagen är sum, total, subtotal, grand total, average, max och min, som beräknar motsvarande värde för raderna ovanför. Se Summera raderna ovanför.

Kommatecken i argument

Ett kommatecken följt av ett mellanslag skiljer argument åt. Ett kommatecken följt av exakt tre siffror fungerar som tusentalsavgränsare. Det går därför att skriva belopp så här:

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

Om funktionen behöver fler värden än vad uppdelningen med mellanslag ger används varje kommatecken som avgränsare, som i det andra anropet. Använd punkt som decimaltecken, till exempel i tip($48, 12.5%).

Använda andra namn i din anteckning

En funktion kan använda variabler från din anteckning. Den läser deras aktuella värde varje gång du anropar den:

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

Variabeln måste redan finnas när du definierar funktionen, så sätt vat = 20% ovanför with_vat. Om den inte finns ännu visas ett fel i definitionsraden.

Parametrarna är lokala för funktionen. En parameter som kallas price läser inte av eller ändrar en variabel som kallas price någon annanstans i anteckningen:

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

Precis som variabler kan en funktion som definieras i ett beräkningsblock användas i senare beräkningsblock i samma anteckning. Varlig går igenom anteckningen uppifrån och ned, så definiera funktionen före den första raden som anropar den. Ett anrop ovanför definitionen visar inget resultat.

Funktioner som anropar andra funktioner

Små funktioner kan bygga på varandra:

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

En funktion kommer ihåg den version av en hjälpfunktion som fanns när den definierades. Om du definierar om hjälpfunktionen längre ned fortsätter tidigare definierade funktioner att använda den gamla versionen:

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

För att använda den nya shipping definierar du total på nytt nedanför den. Detta problem uppstår inte om du redigerar den befintliga definitionen. Varlig räknar om anteckningen från början, så allt nedanför använder då din ändrade version.

En funktion kan också anropa en hjälpfunktion som du definierar längre ned. Då används den version av hjälpfunktionen som finns när anropet görs. Hjälpfunktionen måste alltså vara definierad innan du anropar den yttre funktionen:

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

Villkor

Använd if … then … else … för att välja mellan resultat. Lägg till ytterligare ett if efter else om du behöver fler än två fall:

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

Endast den tillämpliga grenen beräknas. Det gör att du kan skydda dig mot en beräkning som annars skulle misslyckas, till exempel att dividera med noll:

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

Rekursion

En funktion kan anropa sig själv, så länge ett villkor till slut avbryter anropen. Den här räknar antalet handskakningar när alla i en grupp skakar hand med varandra en gång:

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

Varje anrop nästlas en nivå djupare. Högst 12 nästlade anrop tillåts. handshakes(12) fungerar fortfarande, men handshakes(13) visar Error: calculation limit. En funktion som aldrig når sitt stoppvillkor godtas när du definierar den, men når samma gräns när du anropar den. Två funktioner kan också anropa varandra inom samma gräns.

För vardaglig räkning är de inbyggda funktionerna snabbare och har ingen sådan gräns. combination(10, 2) ger också 45, och factorial(n) eller n! täcker det klassiska rekursiva exemplet.

Listor, matriser och mer

Argument kan vara listor, matriser eller komplexa tal. Funktionskroppen kan använda vilken inbyggd funktion som helst:

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

Funktionskroppen kan också innehålla en summering eller en ekvationslösare med en egen lokal variabel. Se Listor och statistik och Summering, ekvationslösning och matematisk analys.

Fallgropar

  • Skriv potenser med ^. x² godtas inte inuti en funktion. Dessutom kan ett kort parameternamn tolkas som en enhet: i w / h² betyder h² timmar i kvadrat, inte parametern h. Skriv w / h^2.
  • Kontrollera antalet argument. Att anropa tip($48) när funktionen förväntar sig två värden visar ett fel.
  • Ett pris utan enhet tolkas som ett enhetspris. I oats(amount) = amount / 1 kg * £0.95 är £0.95 ett pris per kilogram. Varje anrop visar en anmärkning om det. Håll pekaren över anropet för att se "£0.95 in oats treated as a price per kg. Write £0.95/kg there to make it explicit." Skriv ut enhetspriset i definitionen för att ta bort anmärkningen.
  • En rad, en formel. En definition är ett enda uttryck på en rad. För en beräkning med flera steg, definiera en liten funktion för varje steg och kombinera dem.
  • En felaktig omdefinition behåller den gamla versionen. Om en ny definition av tip innehåller ett fel visar raden ett felmeddelande och den tidigare fungerande versionen av tip finns kvar.
  • Resultaten kan ändras när anteckningen räknas om. Anropen beräknas på nytt varje gång, så en funktion som använder random eller dagens datum kan ge ett nytt resultat.
  • Fel förs vidare. Om ett argument gör att formeln misslyckas, till exempel genom division med noll, visas samma fel i anropet.

Begränsningar

Vad Gräns
Parametrar per funktion 32
Inbäddade anrop (en funktion som anropar sig själv eller en annan) 12
Anrop som görs när ett anrop på översta nivån beräknas 16,384
Funktioner definierade i en anteckning 1,024

Om en gräns nås visas Error: calculation limit. Resten av anteckningen fortsätter att fungera. Alla gränser beskrivs under Fel, diagnostik och gränser.

Samlat exempel

Här är en frilansfaktura. Priset och momsen står överst som namngivna värden, och tre små funktioner utför arbetet:

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

Ändra day_rate eller vat så uppdateras alla rader nedanför. Om kunden betalar för sent lägger ett enda anrop till avgiften.