let
Назва let відображає математичне походження конструкції — введення тимчасових прив’язок, як у «Нехай ( x = 2 ) і ( y = 3 )».
Інструкція let у Scheme — конструкція прив’язування, яка визначає змінні в локальній області видимості. Вона дозволяє створити тимчасові прив’язки, а потім виконати блок коду з їх використанням. Це особливо корисно для модульності коду та уникнення забруднення глобальних змінних.
У Scheme є три основні форми let:
let: стандартнийletдля простих локальних прив’язок.let*: послідовнийlet, де прив’язки можуть залежати від попередніх.- Іменований
let: спеціальна формаletдля рекурсивних циклів або іменованих процедур.
У найпростішій формі let створює локальні прив’язки змінних і обчислює вираз з їх використанням.
(let ((variable1 value1)
(variable2 value2))
expression)- Прив’язки: список пар, де кожна пара присвоює
valueзміннійvariable. - Вираз: тіло
let, яке може використовувати локально визначені змінні.
Приклад
(let ((x 10)
(y 20))
(+ x y))- Це визначає дві локальні змінні:
x(10) іy(20). - Потім обчислюється
(+ x y)з їх використанням.
Результат: 30
Конструкція let*
let* подібний до let, але прив’язки оцінюються послідовно — пізніші можуть залежати від попередніх.
(let* ((variable1 value1)
(variable2 expression-using-variable1))
expression)Приклад
(let* ((x 10)
(y (+ x 5)))
(* x y))- Перша прив’язка присвоює
10зміннійx. - Друга обчислює
yяк(+ x 5), використовуючи значенняx. - Тіло обчислює
(* x y).
Результат: 150
Іменований let
Іменований let — спеціальна форма let, яка дає ім’я блоку let, перетворюючи його на рекурсивну процедуру. Це корисно для циклів або рекурсивних обчислень.
(let name ((variable1 initial-value1)
(variable2 initial-value2))
body-expression)- Ім’я: блок
letотримує ім’я, фактично визначаючи функцію. - Прив’язки: початкові значення змінних, як у стандартному
let. - Тіло: вираз може рекурсивно викликати іменований
let.
Приклад: цикл з іменованим let
(let loop ((n 5)
(result 1))
(if (= n 0)
result
(loop (- n 1) (* result n))))- Функція
loopпочинає зn = 5іresult = 1. - Якщо
nдорівнює0, повертаєтьсяresult. - Інакше викликає себе рекурсивно з
n - 1іresult * n.
Результат: 120 (факторіал 5)
Підсумкова таблиця
| Конструкція | Опис | Випадок використання |
|---|---|---|
let | Визначає локальні прив’язки змінних. | Коли всі прив’язки незалежні одна від одної. |
let* | Визначає послідовні локальні прив’язки. | Коли пізніші прив’язки залежать від попередніх. |
Іменований let | Визначає рекурсивні локальні процедури. | Цикли, ітеративні обчислення або локальна рекурсія. |
Приклади
let для локальних обчислень
(let ((x 2)
(y 3))
(+ (* x x) (* y y)))Результат: 13 (обчислює x² + y²)
let* для послідовних залежностей
(let* ((x 2)
(y (* x x))
(z (* y x)))
z)Результат: 8 (обчислює x³)
Іменований let для рекурсивних обчислень
(let factorial ((n 5)
(result 1))
(if (= n 0)
result
(factorial (- n 1) (* result n))))Результат: 120 (факторіал 5)
Завдяки let, let* та іменованому let Scheme дає змогу писати модульний, рекурсивний і послідовний код із чіткими правилами області видимості.