Функції

Функції — ключова концепція Scheme: вони інкапсулюють логіку, дають змогу повторно використовувати код і структурувати скрипти. З їх допомогою можна створювати модульні, підтримувані скрипти — від базових операцій до складних робочих процесів у Lumi.

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

Мінімальний синтаксис і вирази

Код Scheme складається з виразів. Вираз обчислюється як значення. Синтаксис єдиний: дужки утворюють виклик, спочатку — ім’я оператора або функції.

(+ 1 2)         ; Додає 1 і 2, результат — 3
(if #t 1 0)     ; Обчислюється як 1, бо умова істинна
(list 1 2 3)    ; Створює список: (1 2 3)

Оскільки все є виразом, потік керування природно вписується в той самий стиль, що й виклики функцій.

Навіщо потрібні функції

Функції в Scheme важливі з кількох причин:

  • Повторне використання коду: уникайте повторень, інкапсулюючи логіку в багаторазові компоненти.
  • Модульність: розбивайте складні завдання на менші, керовані частини.
  • Динамічна поведінка: приймайте параметри для різних вхідних даних або ситуацій.
  • Вища абстракція: спрощуйте логіку, зосереджуючись на тому, «що» робить функція, а не «як».

Огляд типів функцій

Scheme пропонує різноманітні функціональні конструкції:

  1. Іменовані функції Стандартні функції, визначені через define. Вони — основа більшості скриптів.

    (define (square x)
      (* x x))
  2. Анонімні функції Також відомі як лямбда-функції — безіменні функції, визначені вбудовано для одноразового використання.

    (lambda (x) (* x x))
  3. Функції вищого порядку Функції, які приймають інші функції як аргументи або повертають функції як результати — для відображення, фільтрації, згортання тощо.

    (map (lambda (x) (* x x)) '(1 2 3 4))  ; Повертає (1 4 9 16)

Загальний синтаксис функцій

(define (function-name parameter1 parameter2 ...)
  body-expression)
  • function-name: назва функції.
  • parameter1, parameter2, ...: аргументи функції.
  • body-expression: логіка, яка виконується під час виклику.

Приклад:

(define (add x y)
  (+ x y))

(add 3 5)  ; Повертає 8

Побічні ефекти та глобальний стан

У Lumi багато корисних процедур мають побічні ефекти: змінюють зображення, малюнок, записують файл або виводять результат.

  • Ізолюйте побічні ефекти в невеликих, чітко названих процедурах.
  • Уникайте зміни глобального контексту, якщо це не потрібно.
  • Коли змінюєте контекст (кольори, пензлі тощо), обгорніть роботу в lumi-context-push і lumi-context-pop, щоб відновити стан користувача.