cond
У Scheme умовний оператор cond обирає один із кількох можливих блоків коду на основі серії тестів. Це багатогілковий if: кожна гілка перевіряється по черзі, доки не знайдеться відповідність.
Синтаксис
(cond
(test-1 consequent-1)
(test-2 consequent-2)
...
(else fallback-consequent))- Кожен тест оцінюється в порядку запису.
- Коли тест істинний (
#t), виконується відповідний consequent, іcondприпиняє перевірку. - Гілка
elseнеобов’язкова — резерв, якщо жоден тест не істинний.
Як це працює
Перевірка умов:
condоцінює тести в порядку списку.
Виконання відповідного 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 потужним і читабельним інструментом для складної розгалуженої логіки.