Własne funkcje
Gdy wielokrotnie wpisujesz ten sam wzór z innymi liczbami, zamień go w funkcję. Raz nadajesz nazwę wzorowi i jego argumentom, a potem wywołujesz go tam, gdzie potrzeba: do napiwku, BMI, prognozy oszczędności czy faktury.
Ta strona opisuje definicje i wywołania funkcji, korzystanie z innych nazw notatki, warunki, rekurencję i limity. Funkcje wbudowane, takie jak sqrt i round, opisuje katalog funkcji.
Definiowanie i wywoływanie funkcji
Wpisz nazwę funkcji, parametry w nawiasach, znak równości i wzór. Następnie wywołaj ją z wartościami w tej samej kolejności:
tip(bill, pct) = bill * pcttip($48, 15%) daje $7.20tip($120, 12.5%) daje $15.00tip($36 + $12, 15%) daje $7.20Wiersz definicji nie pokazuje wyniku. Każde wywołanie podstawia wartości za bill i pct i oblicza wzór. Argument może być całym obliczeniem, jak powyższe $36 + $12.
Argumenty są pełnymi wartościami, nie tylko liczbami, więc jednostki i waluty przechodzą przez wzór:
bmi(weight, height) = weight / height^2bmi(81 kg, 1.8 m) daje 25 kg/m²Jednostki pozostają w podanej postaci, więc bmi(81 kg, 180 cm) daje kg/cm². Aby zawsze otrzymać tę samą jednostkę, przeliczaj wewnątrz funkcji:
bmi(weight, height) = (weight / height^2) in kg/m^2bmi(81 kg, 180 cm) daje 25 kg/m²bmi(80 kg, 5.9 ft) daje 24.7375131668 kg/m²Funkcja może nie mieć parametrów. Użyj pustych nawiasów w definicji i wywołaniu:
standard_vat() = 20%£120 * standard_vat() daje £24.00Zwykła zmienna, taka jak standard_vat = 20%, zwykle robi to samo przy krótszym zapisie.
Nazwy i parametry
- Nazwy funkcji i parametrów są pojedynczymi słowami. Używaj liter, cyfr i podkreśleń, jak
net_paylubbmi2, bez spacji. Dlaarea of circle(r) = pi * r^2wiersz sugeruje poprawną nazwę:area_of_circle. - Nazwy funkcji nie rozróżniają wielkości liter: po zdefiniowaniu
Tip(bill, pct)możesz wywołaćtip($48, 15%). - Każdy parametr musi mieć własną nazwę.
f(a, a) = ajest błędem. - Funkcja może mieć do 32 parametrów.
- Nie można użyć nazwy funkcji wbudowanej.
round(x) = …lubsqrt(x) = …daje błąd zamiast ją zastąpić. Zwykła zmienna może jednak mieć taką nazwę, na przykładfloor = 12 m²; zobacz Nazwy. - Nazwy znane z arkuszy
avg,totalistdevsą dostępne dla własnych funkcji. Jeśli zdefiniujesztotal(order), uruchamiana będzie Twoja wersja. - Funkcja i zmienna mogą mieć tę samą nazwę.
rateodczytuje zmienną, arate(5)wywołuje funkcję. - Zawsze wywołuj funkcję z nawiasami. Sama nazwa bez zmiennej o tej nazwie niczego nie pokazuje. Wyjątki to
sum,total,subtotal,grand total,average,maximin, które podsumowują wiersze powyżej; zobacz Sumowanie wcześniejszych wierszy.
Przecinki w argumentach
Przecinek ze spacją rozdziela argumenty, a przecinek z dokładnie trzema cyframi grupuje tysiące, więc kwoty można zapisywać zwyczajnie:
tip(bill, pct) = bill * pcttip($1,200, 15%) daje $180.00tip($1200,15%) daje $180.00Gdy funkcja potrzebuje więcej wartości, niż wynika ze spacji, każdy przecinek rozdziela argumenty, jak w drugim wywołaniu. Do ułamków używaj kropki dziesiętnej, jak w tip($48, 12.5%).
Korzystanie z innych nazw w notatce
Funkcja może korzystać ze zmiennych notatki. Przy każdym wywołaniu odczytuje ich aktualne wartości:
vat = 20%with_vat(price) = price * (1 + vat)with_vat(£50) daje £60.00vat = 5%with_vat(£50) daje £52.50Zmienna musi istnieć przy definiowaniu funkcji, więc umieść vat = 20% nad with_vat. Jeśli jeszcze nie istnieje, definicja pokazuje błąd.
Parametry są lokalne. Parametr price nie odczytuje ani nie zmienia zmiennej price w innym miejscu notatki:
price = £10double(price) = price * 2double(£3) daje £6.00price daje £10.00Podobnie jak zmienne, funkcja zdefiniowana w jednym bloku działa w późniejszych blokach tej samej notatki. Varlig oblicza od góry do dołu, więc definicja musi być nad pierwszym wywołaniem. Wywołanie powyżej definicji nie pokazuje wyniku.
Funkcje wywołujące inne funkcje
Małe funkcje mogą korzystać z siebie nawzajem:
day_rate = £400fee(days) = days * day_rateinvoice(days) = fee(days) * 1.2invoice(5) daje £2,400.00Funkcja zapamiętuje wersję funkcji pomocniczej istniejącą w chwili definicji. Ponowna definicja funkcji pomocniczej niżej nie zmienia wcześniej zdefiniowanych funkcji — używają starej wersji:
shipping(order) = £4.95total(order) = order + shipping(order)shipping(order) = £2.95total(£30) daje £34.95shipping(£30) daje £2.95Aby użyć nowego shipping, zdefiniuj total ponownie pod nim. Edycja definicji w jej dotychczasowym miejscu nie powoduje tego problemu. Varlig przelicza notatkę od góry, więc wszystko poniżej używa poprawionej wersji.
Funkcja może też wywoływać funkcję pomocniczą zdefiniowaną niżej. Wtedy używa wersji dostępnej w chwili wywołania, więc funkcja pomocnicza musi istnieć przed wywołaniem funkcji zewnętrznej:
checkout(order) = order + delivery(order)delivery(order) = if order >= £40 then £0 else £3.50checkout(£25) daje £28.50checkout(£60) daje £60.00Warunki
Użyj if … then … else …, aby wybierać wynik. Kolejne if po else pozwala obsłużyć więcej niż dwa przypadki:
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20postage(90 g) daje £0.85postage(500 g) daje £1.55postage(1.2 kg) daje £3.20Obliczana jest tylko wybrana gałąź. Pozwala to zabezpieczyć obliczenie przed błędem, takim jak dzielenie przez zero:
per_person(total, people) = if people > 0 then total / people else £0per_person(£90, 3) daje £30.00per_person(£90, 0) daje £0.00Rekurencja
Funkcja może wywoływać samą siebie, jeśli warunek w końcu ją zatrzyma. Ta liczy uściski dłoni, gdy każdy w grupie wita się raz z każdym:
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)handshakes(6) daje 15handshakes(10) daje 45Każde wywołanie zwiększa zagnieżdżenie o jeden poziom; dozwolonych jest najwyżej 12. handshakes(12) działa, a handshakes(13) pokazuje Error: calculation limit. Funkcja bez osiągalnego warunku końcowego jest akceptowana w definicji i dochodzi do tego samego limitu przy wywołaniu. Dwie funkcje mogą też wywoływać się wzajemnie w tym samym limicie.
Do zwykłego liczenia funkcje wbudowane są szybsze i nie mają tego ograniczenia. combination(10, 2) również daje 45, a factorial(n) lub n! zastępuje klasyczny przykład rekurencji.
Listy, macierze i inne wartości
Argumentami mogą być listy, macierze lub liczby zespolone, a ciało funkcji może korzystać z dowolnej funkcji wbudowanej:
spread(scores) = max(scores) - min(scores)spread([12, 18, 9, 21]) daje 12Ciało może też zawierać sumowanie lub rozwiązywanie równania z własną zmienną lokalną. Zobacz Listy i statystyka oraz Sumowanie, równania i rachunek różniczkowy.
Pułapki
- Potęgi zapisuj przez
^.x²nie jest obsługiwane wewnątrz funkcji. Krótka nazwa parametru może też pasować do jednostki: ww / h²fragmenth²oznacza godziny do kwadratu, a nie parametrh. Wpiszw / h^2. - Sprawdź liczbę argumentów.
tip($48)daje błąd, jeśli funkcja oczekuje dwóch wartości. - Sama cena jest interpretowana jako cena jednostkowa. W
oats(amount) = amount / 1 kg * £0.95kwota £0,95 oznacza cenę za kilogram. Każde wywołanie o tym informuje; po najechaniu widać: „£0.95 in oats treated as a price per kg. Write £0.95/kg there to make it explicit.” Jawny zapis stawki w definicji usuwa tę uwagę. - Jeden wiersz, jeden wzór. Definicja jest pojedynczym wyrażeniem w jednym wierszu. Dla kilku etapów zdefiniuj małą funkcję dla każdego i połącz je.
- Błędna nowa definicja zachowuje starą wersję. Jeśli ponowna definicja
tipjest błędna, wiersz pokazuje błąd, a poprzednia działającatipnadal jest dostępna. - Wyniki mogą się zmieniać po przeliczeniu notatki. Wywołania są obliczane na nowo, więc funkcja używająca
randomlub dzisiejszej daty może dać nowy wynik. - Błędy są przekazywane dalej. Jeśli argument powoduje błąd wzoru, na przykład dzielenie przez zero, wywołanie pokaże ten błąd.
Limity
| Element | Limit |
|---|---|
| Parametry jednej funkcji | 32 |
| Zagnieżdżone wywołania (funkcja wywołuje siebie lub inną funkcję) | 12 |
| Wywołania podczas obliczania jednego wywołania najwyższego poziomu | 16,384 |
| Funkcje zdefiniowane w notatce | 1,024 |
Przekroczenie limitu pokazuje Error: calculation limit. Pozostała część notatki nadal działa. Wszystkie limity opisuje Błędy, diagnostyka i limity.
Przykład całościowy
Oto faktura freelancera. Stawka i VAT są nazwanymi wartościami na górze, a trzy małe funkcje wykonują obliczenia:
# 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) daje £3,600.00build = fee(4.5) daje £2,025.00subtotal = design + build daje £5,625.00with_vat(subtotal) daje £6,750.00late_fee(with_vat(subtotal), 45) daje £135.00Zmień day_rate lub vat, a wszystkie niższe wiersze się zaktualizują. Przy opóźnionej płatności jedno wywołanie dodaje opłatę.