Уникайте умовних умов
K має умовну конструкцію ( :[
), яка еквівалентна стилю Ліспа cond
:
:[cond1;result1; cond2;result2; cond3;result3; default]
Ви можете мати скільки завгодно умов, і якщо жодне не відповідає значенню за замовчуванням, не повертається.
Іноді (як у рекурсивних програмах чи програмах, які в іншому випадку покладаються на послідовність побічних ефектів), неможливо обійтись одним із них. Однак у ситуаціях, коли ви можете дозволити собі зробити додаткову роботу, часто можете замінити "cond" на індексацію списку.
Розгляньте сумнозвісну програму fizzbuzz . Написані у звичайному імперативному стилі програмування, ми можемо піти з:
{:[~x!15;"FizzBuzz";~x!3;"Fizz";~x!5;"Buzz";x]}'1+!100
Тут є досить багато повторень у тестах на роздільність. Інший підхід визнає, що є 4 випадки (кількість, поділ лише на 3, поділ лише на 5, поділ на 3 і 5) та спроби безпосередньо обчислити індекс, який обирає один із цих випадків зі списку:
{(x;"Fizz";"Buzz";"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
Два символи коротше, а мова краще використовується. Знаючи, що літерали списків оцінюються праворуч ліворуч, ми також отримуємо деякі додаткові можливості для гольфу для поєднання повторно використаних субпрекспресій. Ми не могли б легко зробити це у конвертованій версії, оскільки рядкові рядки взагалі не оцінюються, якщо вони не вибрані:
{(x;4#t;4_ t;t:"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
Тепер ми зберегли 5 символів. До речі, саме цей приклад працює в k5 ще приємніше, оскільки у нас є перевантаження "pack" для /
обробки кроку множення на вектор коефіцієнтів та підсумовування:
{(x;4_t;4#t;t:"FizzBuzz")@2 2/~3 5!\:x}'1+!100
Також зауважте, що поведінка "find" ( ?
), яка виробляє індекс минулого кінця списку ключів, якщо елемент не знайдений, спеціально розроблена для підтримки обробки випадку "за замовчуванням" у такому вигляді індексації. Розглянемо цей фрагмент для перетворення голосних звуків у великі регістри:
{("AEIOU",x)"aeiou"?x}'
У порівнянні з одним із:
{t:"aeiou"?x;:[t<5;"AEIOU"t;x]}'
{:[~4<t:"aeiou"?x;"AEIOU"t;x]}'
(Я знаю, що я теж хотів би прочитати!)