Перейти до вмісту
Посібник Varlig
Головна сторінка Varlig

Власні функції

Якщо часто повторюєте формулу з різними числами, перетворіть її на функцію. Один раз назвіть формулу та її параметри, а потім викликайте для чайових, ІМТ, прогнозу заощаджень чи рахунку.

Тут описано визначення й виклик функцій, використання інших імен нотатки, умови, рекурсію та обмеження. Вбудовані функції Varlig, як-от sqrt і round, наведено в довіднику функцій.

Визначення й виклик функції

Напишіть ім’я функції, параметри в круглих дужках, знак рівності й формулу. Потім викликайте її зі значеннями в тому самому порядку:

calc
tip(bill, pct) = bill * pct
tip($48, 15%) дорівнює $7.20
tip($120, 12.5%) дорівнює $15.00
tip($36 + $12, 15%) дорівнює $7.20

Рядок визначення не показує відповіді. Кожен виклик підставляє значення замість bill і pct та обчислює формулу. Аргумент може бути цілим обчисленням, як $36 + $12 вище.

Аргументи — повноцінні значення, а не лише числа, тому одиниці й валюти проходять крізь формулу:

calc
bmi(weight, height) = weight / height^2
bmi(81 kg, 1.8 m) дорівнює 25 kg/m²

Одиниці зберігаються як задано: bmi(81 kg, 180 cm) дає кг/см². Для однакової одиниці результату за будь-яких аргументів виконуйте перетворення всередині функції:

calc
bmi(weight, height) = (weight / height^2) in kg/m^2
bmi(81 kg, 180 cm) дорівнює 25 kg/m²
bmi(80 kg, 5.9 ft) дорівнює 24.7375131668 kg/m²

Функція може не мати параметрів. Пишіть порожні круглі дужки і у визначенні, і під час виклику:

calc
standard_vat() = 20%
£120 * standard_vat() дорівнює £24.00

Звичайна змінна, як-от standard_vat = 20%, зазвичай робить те саме коротшим записом.

Назви й параметри

  • Імена функцій і параметрів мають бути одним словом із літер, цифр та підкреслень, наприклад net_pay або bmi2, без пробілів. Для area of circle(r) = pi * r^2 рядок запропонує ім’я area_of_circle.
  • Регістр імен функцій неважливий: після визначення Tip(bill, pct) можна викликати tip($48, 15%).
  • Кожен параметр потребує окремого імені. f(a, a) = a дає помилку.
  • Функція може мати до 32 параметрів.
  • Ім’я вбудованої функції не можна перевизначити: round(x) = … або sqrt(x) = … дає помилку. Звичайна змінна може мати таке ім’я, наприклад floor = 12 m²; див. Імена.
  • Назви, знайомі з електронних таблиць, avg, total і stdev можна використовувати. Визначте власну total(order), і викликатиметься ваша версія.
  • Функція й змінна можуть мати однакове ім’я: rate читає змінну, а rate(5) викликає функцію.
  • Завжди викликайте функцію з круглими дужками. Саме ім’я без однойменної змінної нічого не показує. Винятки — sum, total, subtotal, grand total, average, max і min, які обчислюють відповідний показник рядків вище; див. Підсумовування попередніх рядків.

Коми в аргументах

Кома з пробілом розділяє аргументи, а кома рівно перед трьома цифрами групує тисячі, тож суми можна записувати звичним способом:

calc
tip(bill, pct) = bill * pct
tip($1,200, 15%) дорівнює $180.00
tip($1200,15%) дорівнює $180.00

Якщо функції потрібно більше значень, ніж відділено пробілами, кожна кома стає роздільником, як у другому виклику. Для дробової частини використовуйте крапку: tip($48, 12.5%).

Використання інших назв із нотатки

Функція може використовувати змінні нотатки й читає їхні поточні значення під час кожного виклику:

calc
vat = 20%
with_vat(price) = price * (1 + vat)
with_vat(£50) дорівнює £60.00
vat = 5%
with_vat(£50) дорівнює £52.50

Змінна має існувати до визначення функції, тому розмістіть vat = 20% вище за with_vat. Якщо змінної ще немає, рядок визначення покаже помилку.

Параметри локальні для функції. Параметр price не читає й не змінює змінну price в іншому місці нотатки:

calc
price = £10
double(price) = price * 2
double(£3) дорівнює £6.00
price дорівнює £10.00

Як і змінні, функція з одного блоку обчислень доступна в подальших блоках тієї самої нотатки. Varlig опрацьовує нотатку згори вниз, тому визначайте функцію перед першим викликом. Виклик вище за визначення не показує відповіді.

Функції, що викликають інші функції

Невеликі функції можуть використовувати одна одну:

calc
day_rate = £400
fee(days) = days * day_rate
invoice(days) = fee(days) * 1.2
invoice(5) дорівнює £2,400.00

Функція запам’ятовує версію допоміжної функції, наявну під час визначення. Якщо нижче перевизначити допоміжну функцію, раніше визначені функції збережуть стару версію:

calc
shipping(order) = £4.95
total(order) = order + shipping(order)
shipping(order) = £2.95
total(£30) дорівнює £34.95
shipping(£30) дорівнює £2.95

Щоб використати нову shipping, знову визначте total нижче за неї. Редагування наявного визначення не створює цієї ситуації: Varlig перераховує нотатку згори, і всі подальші рядки використовують змінену версію.

Функція також може звертатися до допоміжної, визначеної нижче. Тоді використовується її версія на момент виклику, отже допоміжна функція має існувати до виклику зовнішньої:

calc
checkout(order) = order + delivery(order)
delivery(order) = if order >= £40 then £0 else £3.50
checkout(£25) дорівнює £28.50
checkout(£60) дорівнює £60.00

Умови

Використовуйте if … then … else … для вибору результату. Для понад двох випадків додайте ще одне if після else:

calc
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20
postage(90 g) дорівнює £0.85
postage(500 g) дорівнює £1.55
postage(1.2 kg) дорівнює £3.20

Обчислюється лише вибрана гілка. Так можна запобігти помилці, наприклад діленню на нуль:

calc
per_person(total, people) = if people > 0 then total / people else £0
per_person(£90, 3) дорівнює £30.00
per_person(£90, 0) дорівнює £0.00

Рекурсія

Функція може викликати сама себе, якщо умова зрештою зупиняє виклики. Ця рахує рукостискання, коли кожен у групі тисне руку кожному іншому один раз:

calc
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)
handshakes(6) дорівнює 15
handshakes(10) дорівнює 45

Кожен виклик додає рівень вкладеності; дозволено до 12 рівнів. handshakes(12) працює, а handshakes(13) показує Error: calculation limit. Визначення без досяжної умови зупинки приймається, але виклик досягає того самого ліміту. Дві функції також можуть викликати одна одну в межах цього обмеження.

Для звичайного підрахунку вбудовані функції швидші й не мають такого обмеження. combination(10, 2) також дає 45, а factorial(n) або n! замінює класичний приклад рекурсії.

Списки, матриці та інші значення

Аргументами можуть бути списки, матриці й комплексні числа, а тіло функції може використовувати будь-які вбудовані функції:

calc
spread(scores) = max(scores) - min(scores)
spread([12, 18, 9, 21]) дорівнює 12

Тіло також може містити сумування або розв’язувач рівняння з власною локальною змінною. Див. Списки й статистика та Сумування, рівняння й математичний аналіз.

Типові труднощі

  • Записуйте степені через ^. x² усередині функції не підтримується. Ба більше, коротке ім’я параметра може збігтися з одиницею: у w / h² запис h² означає квадратні години, а не параметр h. Пишіть w / h^2.
  • Перевіряйте кількість аргументів. tip($48) дає помилку, якщо функція очікує два значення.
  • Ціна без уточнення читається як ціна за одиницю. У oats(amount) = amount / 1 kg * £0.95 сума £0.95 означає ціну за кілограм. Кожен виклик має пояснення при наведенні: «£0.95 у oats трактується як ціна за кг. Запишіть там £0.95/kg для однозначності». Явний запис ставки у визначенні прибирає пояснення.
  • Один рядок — одна формула. Визначення є одним виразом в одному рядку. Для багатокрокового обчислення створіть невелику функцію для кожного кроку й поєднайте їх.
  • Хибне перевизначення зберігає стару версію. Якщо нове визначення tip містить помилку, рядок повідомляє про неї, а попередня робоча tip залишається доступною.
  • Після перерахунку нотатки відповіді можуть змінитися. Виклики обчислюються щоразу, тому функція з random або поточною датою може дати нову відповідь.
  • Помилки передаються далі. Якщо аргумент спричиняє помилку формули, наприклад ділення на нуль, виклик показує цю помилку.

Обмеження

Що обмежується Межа
Параметри однієї функції 32
Вкладені виклики (функція викликає себе або іншу функцію) 12
Кількість викликів під час обчислення одного виклику верхнього рівня 16,384
Функції, визначені в нотатці 1,024

Досягнення ліміту показує Error: calculation limit. Решта нотатки працює далі. Усі обмеження наведено в розділі Помилки, діагностика й обмеження.

Поєднання можливостей

Ось рахунок фрилансера. Ставка й ПДВ задані вгорі іменованими значеннями, а три невеликі функції виконують розрахунки:

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) дорівнює £3,600.00
build = fee(4.5) дорівнює £2,025.00
subtotal = design + build дорівнює £5,625.00
with_vat(subtotal) дорівнює £6,750.00
late_fee(with_vat(subtotal), 45) дорівнює £135.00

Змініть day_rate або vat, і всі рядки нижче оновляться. Якщо клієнт запізнився з оплатою, один виклик додає пеню.