cond

У Scheme умовний оператор cond обирає один із кількох можливих блоків коду на основі серії тестів. Це багатогілковий if: кожна гілка перевіряється по черзі, доки не знайдеться відповідність.

Синтаксис

(cond
  (test-1 consequent-1)
  (test-2 consequent-2)
  ...
  (else fallback-consequent))
  • Кожен тест оцінюється в порядку запису.
  • Коли тест істинний (#t), виконується відповідний consequent, і cond припиняє перевірку.
  • Гілка else необов’язкова — резерв, якщо жоден тест не істинний.

Як це працює

  1. Перевірка умов:

    • cond оцінює тести в порядку списку.
  2. Виконання відповідного consequent:

    • Коли знайдено перший істинний тест, виконується його consequent.
    • Якщо жоден тест не істинний і є else, виконується fallback-consequent.

Приклади

Приклад 1: одновиразові consequent

(cond
  ((< 3 2) "This won't run")
  ((= 3 3) "This will run")
  (else "Fallback"))
  • Перший тест (< 3 2) хибний.
  • Другий тест (= 3 3) істинний, тому повертається "This will run".
  • Гілка else не виконується.

Результат: “This will run”

Приклад 2: кілька дій через begin

Коли consequent містить кілька дій, згрупуйте їх у begin:

(cond
  ((< 5 3)
    (begin
      (lumi-message "This won't run")
      (* 2 3)))
  ((> 5 3)
    (begin
      (lumi-message "Condition met")
      (* 5 5)))
  (else
    (begin
      (lumi-message "Fallback")
      0)))
  • Перший тест (< 5 3) хибний.
  • Другий тест (> 5 3) істинний:
    • виводиться "Condition met";
    • обчислюється (* 5 5) і повертається 25.

Результат: виводить “Condition met” і повертає 25.

Приклад 3: блок let у consequent

Для локальних змінних використовуйте let:

(cond
  ;; Випадок 1: якщо 0 менше -1
  ((< 0 -1)
    (let ((x 10))
      (* x x)))

  ;; Випадок 2: якщо 0 більше -1
  ((> 0 -1)
    (let ((y 20))
      (lumi-message "Positive condition met")
      (+ y y)))

  ;; За замовчуванням: якщо жодна з умов не виконалась
  (else
    (let ((z 0))
      z)))
  • Перший тест (< 0 -1) хибний.
  • Другий тест (> 0 -1) істинний:
    • let прив’язує y до 20;
    • виводиться "Positive condition met";
    • обчислюється (+ y y) і повертається 40.

Результат: виводить “Positive condition met” і повертає 40.

Приклад 4: резерв через else

(cond
  ((< 5 3) "This won't run")
  ((= 5 3) "This won't run either")
  (else "Fallback value"))
  • Жоден з перших двох тестів не істинний.
  • Виконується else і повертається "Fallback value".

Результат: “Fallback value”

Підсумок

  • Використовуйте cond для кількох умов у чіткій структурі.
  • Consequent можуть бути одновиразовими виразами або групами дій через begin.
  • У consequent використовуйте let для локальних змінних.
  • Додавайте else як резерв для неочікуваних випадків.

Ця гнучкість робить cond потужним і читабельним інструментом для складної розгалуженої логіки.