Przejdź do treści
Przewodnik po Varlig
Strona główna Varlig

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:

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

Wiersz 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:

calc
bmi(weight, height) = weight / height^2
bmi(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:

calc
bmi(weight, height) = (weight / height^2) in kg/m^2
bmi(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:

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

Zwykł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_pay lub bmi2, bez spacji. Dla area of circle(r) = pi * r^2 wiersz 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) = a jest błędem.
  • Funkcja może mieć do 32 parametrów.
  • Nie można użyć nazwy funkcji wbudowanej. round(x) = … lub sqrt(x) = … daje błąd zamiast ją zastąpić. Zwykła zmienna może jednak mieć taką nazwę, na przykład floor = 12 m²; zobacz Nazwy.
  • Nazwy znane z arkuszy avg, total i stdev są dostępne dla własnych funkcji. Jeśli zdefiniujesz total(order), uruchamiana będzie Twoja wersja.
  • Funkcja i zmienna mogą mieć tę samą nazwę. rate odczytuje zmienną, a rate(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, max i min, 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:

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

Gdy 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:

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

Zmienna 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:

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

Podobnie 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:

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

Funkcja 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:

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

Aby 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:

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

Warunki

Użyj if … then … else …, aby wybierać wynik. Kolejne if po else pozwala obsłużyć więcej niż dwa przypadki:

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

Obliczana jest tylko wybrana gałąź. Pozwala to zabezpieczyć obliczenie przed błędem, takim jak dzielenie przez zero:

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

Rekurencja

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:

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

Każ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:

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

Ciał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: w w / h² fragment h² oznacza godziny do kwadratu, a nie parametr h. Wpisz w / 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.95 kwota £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 tip jest błędna, wiersz pokazuje błąd, a poprzednia działająca tip nadal jest dostępna.
  • Wyniki mogą się zmieniać po przeliczeniu notatki. Wywołania są obliczane na nowo, więc funkcja używająca random lub 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:

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

Zmień day_rate lub vat, a wszystkie niższe wiersze się zaktualizują. Przy opóźnionej płatności jedno wywołanie dodaje opłatę.