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 (обчислює )


Іменований let для рекурсивних обчислень

(let factorial ((n 5)
                (result 1))
  (if (= n 0)
      result
      (factorial (- n 1) (* result n))))

Результат: 120 (факторіал 5)


Завдяки let, let* та іменованому let Scheme дає змогу писати модульний, рекурсивний і послідовний код із чіткими правилами області видимості.