Власні функції
Якщо часто повторюєте формулу з різними числами, перетворіть її на функцію. Один раз назвіть формулу та її параметри, а потім викликайте для чайових, ІМТ, прогнозу заощаджень чи рахунку.
Тут описано визначення й виклик функцій, використання інших імен нотатки, умови, рекурсію та обмеження. Вбудовані функції Varlig, як-от sqrt і round, наведено в довіднику функцій.
Визначення й виклик функції
Напишіть ім’я функції, параметри в круглих дужках, знак рівності й формулу. Потім викликайте її зі значеннями в тому самому порядку:
tip(bill, pct) = bill * pcttip($48, 15%) дорівнює $7.20tip($120, 12.5%) дорівнює $15.00tip($36 + $12, 15%) дорівнює $7.20Рядок визначення не показує відповіді. Кожен виклик підставляє значення замість bill і pct та обчислює формулу. Аргумент може бути цілим обчисленням, як $36 + $12 вище.
Аргументи — повноцінні значення, а не лише числа, тому одиниці й валюти проходять крізь формулу:
bmi(weight, height) = weight / height^2bmi(81 kg, 1.8 m) дорівнює 25 kg/m²Одиниці зберігаються як задано: bmi(81 kg, 180 cm) дає кг/см². Для однакової одиниці результату за будь-яких аргументів виконуйте перетворення всередині функції:
bmi(weight, height) = (weight / height^2) in kg/m^2bmi(81 kg, 180 cm) дорівнює 25 kg/m²bmi(80 kg, 5.9 ft) дорівнює 24.7375131668 kg/m²Функція може не мати параметрів. Пишіть порожні круглі дужки і у визначенні, і під час виклику:
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, які обчислюють відповідний показник рядків вище; див. Підсумовування попередніх рядків.
Коми в аргументах
Кома з пробілом розділяє аргументи, а кома рівно перед трьома цифрами групує тисячі, тож суми можна записувати звичним способом:
tip(bill, pct) = bill * pcttip($1,200, 15%) дорівнює $180.00tip($1200,15%) дорівнює $180.00Якщо функції потрібно більше значень, ніж відділено пробілами, кожна кома стає роздільником, як у другому виклику. Для дробової частини використовуйте крапку: tip($48, 12.5%).
Використання інших назв із нотатки
Функція може використовувати змінні нотатки й читає їхні поточні значення під час кожного виклику:
vat = 20%with_vat(price) = price * (1 + vat)with_vat(£50) дорівнює £60.00vat = 5%with_vat(£50) дорівнює £52.50Змінна має існувати до визначення функції, тому розмістіть vat = 20% вище за with_vat. Якщо змінної ще немає, рядок визначення покаже помилку.
Параметри локальні для функції. Параметр price не читає й не змінює змінну price в іншому місці нотатки:
price = £10double(price) = price * 2double(£3) дорівнює £6.00price дорівнює £10.00Як і змінні, функція з одного блоку обчислень доступна в подальших блоках тієї самої нотатки. Varlig опрацьовує нотатку згори вниз, тому визначайте функцію перед першим викликом. Виклик вище за визначення не показує відповіді.
Функції, що викликають інші функції
Невеликі функції можуть використовувати одна одну:
day_rate = £400fee(days) = days * day_rateinvoice(days) = fee(days) * 1.2invoice(5) дорівнює £2,400.00Функція запам’ятовує версію допоміжної функції, наявну під час визначення. Якщо нижче перевизначити допоміжну функцію, раніше визначені функції збережуть стару версію:
shipping(order) = £4.95total(order) = order + shipping(order)shipping(order) = £2.95total(£30) дорівнює £34.95shipping(£30) дорівнює £2.95Щоб використати нову shipping, знову визначте total нижче за неї. Редагування наявного визначення не створює цієї ситуації: Varlig перераховує нотатку згори, і всі подальші рядки використовують змінену версію.
Функція також може звертатися до допоміжної, визначеної нижче. Тоді використовується її версія на момент виклику, отже допоміжна функція має існувати до виклику зовнішньої:
checkout(order) = order + delivery(order)delivery(order) = if order >= £40 then £0 else £3.50checkout(£25) дорівнює £28.50checkout(£60) дорівнює £60.00Умови
Використовуйте if … then … else … для вибору результату. Для понад двох випадків додайте ще одне if після else:
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20postage(90 g) дорівнює £0.85postage(500 g) дорівнює £1.55postage(1.2 kg) дорівнює £3.20Обчислюється лише вибрана гілка. Так можна запобігти помилці, наприклад діленню на нуль:
per_person(total, people) = if people > 0 then total / people else £0per_person(£90, 3) дорівнює £30.00per_person(£90, 0) дорівнює £0.00Рекурсія
Функція може викликати сама себе, якщо умова зрештою зупиняє виклики. Ця рахує рукостискання, коли кожен у групі тисне руку кожному іншому один раз:
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)handshakes(6) дорівнює 15handshakes(10) дорівнює 45Кожен виклик додає рівень вкладеності; дозволено до 12 рівнів. handshakes(12) працює, а handshakes(13) показує Error: calculation limit. Визначення без досяжної умови зупинки приймається, але виклик досягає того самого ліміту. Дві функції також можуть викликати одна одну в межах цього обмеження.
Для звичайного підрахунку вбудовані функції швидші й не мають такого обмеження. combination(10, 2) також дає 45, а factorial(n) або n! замінює класичний приклад рекурсії.
Списки, матриці та інші значення
Аргументами можуть бути списки, матриці й комплексні числа, а тіло функції може використовувати будь-які вбудовані функції:
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. Решта нотатки працює далі. Усі обмеження наведено в розділі Помилки, діагностика й обмеження.
Поєднання можливостей
Ось рахунок фрилансера. Ставка й ПДВ задані вгорі іменованими значеннями, а три невеликі функції виконують розрахунки:
# 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) дорівнює £3,600.00build = fee(4.5) дорівнює £2,025.00subtotal = design + build дорівнює £5,625.00with_vat(subtotal) дорівнює £6,750.00late_fee(with_vat(subtotal), 45) дорівнює £135.00Змініть day_rate або vat, і всі рядки нижче оновляться. Якщо клієнт запізнився з оплатою, один виклик додає пеню.