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:
tip(bill, pct) = bill * pcttip($48, 15%) ger $7.20tip($120, 12.5%) ger $15.00tip($36 + $12, 15%) ger $7.20Definitionsraden 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:
bmi(weight, height) = weight / height^2bmi(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:
bmi(weight, height) = (weight / height^2) in kg/m^2bmi(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:
standard_vat() = 20%£120 * standard_vat() ger £24.00En 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_payellerbmi2. Om du skriverarea of circle(r) = pi * r^2föreslår raden i stället namnetarea_of_circle. - Funktionsnamn skiljer inte på stora och små bokstäver. Om du definierar
Tip(bill, pct)kan du anropatip($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) = …ellersqrt(x) = …visar ett fel istället för att ersätta det. En vanlig variabel kan fortfarande använda ett av dessa namn, till exempelfloor = 12 m²; se Namn. - Namnen
avg,totalochstdev, som används i kalkylblad, är fria att använda. Definierar du en egentotal(order)är det din version som körs. - En funktion och en variabel kan dela ett namn.
rateläser variabeln ochrate(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,maxochmin, 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:
tip(bill, pct) = bill * pcttip($1,200, 15%) ger $180.00tip($1200,15%) ger $180.00Om 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:
vat = 20%with_vat(price) = price * (1 + vat)with_vat(£50) ger £60.00vat = 5%with_vat(£50) ger £52.50Variabeln 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:
price = £10double(price) = price * 2double(£3) ger £6.00price ger £10.00Precis 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:
day_rate = £400fee(days) = days * day_rateinvoice(days) = fee(days) * 1.2invoice(5) ger £2,400.00En 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:
shipping(order) = £4.95total(order) = order + shipping(order)shipping(order) = £2.95total(£30) ger £34.95shipping(£30) ger £2.95Fö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:
checkout(order) = order + delivery(order)delivery(order) = if order >= £40 then £0 else £3.50checkout(£25) ger £28.50checkout(£60) ger £60.00Villkor
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:
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20postage(90 g) ger £0.85postage(500 g) ger £1.55postage(1.2 kg) ger £3.20Endast 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:
per_person(total, people) = if people > 0 then total / people else £0per_person(£90, 3) ger £30.00per_person(£90, 0) ger £0.00Rekursion
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:
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)handshakes(6) ger 15handshakes(10) ger 45Varje 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:
spread(scores) = max(scores) - min(scores)spread([12, 18, 9, 21]) ger 12Funktionskroppen 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: iw / h²betyderh²timmar i kvadrat, inte parameternh. Skrivw / 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
tipinnehåller ett fel visar raden ett felmeddelande och den tidigare fungerande versionen avtipfinns kvar. - Resultaten kan ändras när anteckningen räknas om. Anropen beräknas på nytt varje gång, så en funktion som använder
randomeller 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:
# 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) ger £3,600.00build = fee(4.5) ger £2,025.00subtotal = design + build ger £5,625.00with_vat(subtotal) ger £6,750.00late_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.