Варіативні функції

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

Варіативні функції особливо корисні, коли:

  • кількість аргументів заздалегідь невідома;
  • потрібно застосувати одну операцію до динамічного списку вхідних даних;
  • пишете утиліти для агрегації або перетворення даних.

Синтаксис варіативних функцій

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

(define (function-name fixed-parameters . variadic-parameter)
  body-expression)
  • fixed-parameters: обов’язкові фіксовані аргументи.
  • variadic-parameter: спеціальний параметр після ., який збирає додаткові аргументи у список.
  • body-expression: логіка, яка виконується під час виклику.

Приклади варіативних функцій

Базова варіативна функція

(define (sum . numbers)
  (apply + numbers))
  • Пояснення:
    • numbers збирає всі аргументи в список.
    • apply застосовує + до всіх елементів списку.

Використання:

(sum 1 2 3 4 5)  ; Повертає 15

Варіативна функція з фіксованими параметрами

Фіксовані параметри можна поєднувати з варіативним:

(define (greet prefix . names)
  (map (lambda (name) (string-append prefix " " name)) names))
  • Пояснення:
    • prefix — фіксований аргумент.
    • names збирає решту аргументів у список.
    • Кожне ім’я доповнюється префіксом через map і lambda.

Використання:

(greet "Hello" "Alice" "Bob" "Charlie")  ; Повертає ("Hello Alice" "Hello Bob" "Hello Charlie")

Поєднання фіксованої та варіативної логіки

(define (describe-collection collection-name . items)
  (string-append collection-name ": " (string-join items ", ")))
  • Пояснення:
    • collection-name — фіксований параметр.
    • items збирає додаткові аргументи в список.
    • Функція об’єднує назву колекції та елементи в один рядок.

Використання:

(describe-collection "Fruits" "Apple" "Banana" "Cherry")
; Повертає "Fruits: Apple, Banana, Cherry"

Розширені випадки

Обробка довільних вхідних даних

Варіативні функції добре працюють з довільними даними. Приклад підсумовування лише додатних чисел:

(define (sum-positive . numbers)
  (apply + (filter (lambda (x) (> x 0)) numbers)))
  • Відфільтровує недодатні числа перед підсумовуванням.

Використання:

(sum-positive -5 3 7 -2 8)  ; Повертає 18

Варіативні функції з рекурсією

(define (max-value first . rest)
  (if (null? rest)
      first
      (max first (apply max rest))))
  • Пояснення:
    • first обробляє перший аргумент.
    • rest збирає решту аргументів у список.
    • Рекурсивно обчислює максимальне значення.

Використання:

(max-value 10 20 5 40 15)  ; Повертає 40

Переваги варіативних функцій

  • Гнучкість: обробляють широкий спектр вхідних даних.
  • Стислість: зменшують потребу в кількох перевантажених функціях.
  • Динамічні операції: обробка даних під час виконання без заздалегідь відомої кількості аргументів.

Коли використовувати варіативні функції

Використовуйте варіативні функції, коли:

  • функції потрібно обробити невідому кількість аргументів;
  • одна операція застосовується до всіх вхідних даних (підсумовування, конкатенація, відображення);
  • потрібно спростити логіку вищого порядку з динамічними аргументами.

Уникайте варіативних функцій, коли:

  • складна перевірка введення або типів;
  • достатньо фіксованих аргументів;
  • читабельність страждає через надто складну логіку.

Підсумок

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