Évitez les conditions
K a une construction conditionnelle ( :[
) qui est équivalente à un style Lisp cond
:
:[cond1;result1; cond2;result2; cond3;result3; default]
Vous pouvez avoir autant de conditions que vous le souhaitez et si aucune ne correspond, la valeur par défaut est renvoyée.
Parfois (comme dans les programmes récursifs ou les programmes qui reposent autrement sur une séquence d'effets secondaires), il est impossible de contourner l'utilisation de l'un d'eux. Cependant, dans les situations où vous pouvez vous permettre de faire un peu de travail supplémentaire, vous pouvez souvent remplacer un "cond" par une indexation de liste.
Considérez le fameux programme fizzbuzz . Écrit dans un style de programmation impératif conventionnel, nous pourrions aller avec:
{:[~x!15;"FizzBuzz";~x!3;"Fizz";~x!5;"Buzz";x]}'1+!100
Il y a pas mal de répétition ici dans les tests de divisibilité. Une approche différente reconnaît qu'il y a 4 cas (un nombre, divisibilité par seulement 3, divisibilité par seulement 5, divisibilité par 3 et 5) et tente de calculer directement un indice qui choisit l'un de ces cas dans une liste:
{(x;"Fizz";"Buzz";"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
Deux caractères plus courts, et une meilleure utilisation de la langue. Sachant que les littéraux de liste sont évalués de droite à gauche, nous gagnons également des opportunités de golf supplémentaires pour combiner des sous-expressions réutilisées. Nous n'aurions pas pu le faire facilement dans la version basée sur les conditions, car les cas de chaîne ne sont pas évalués du tout s'ils ne sont pas sélectionnés:
{(x;4#t;4_ t;t:"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
Maintenant, nous avons enregistré 5 caractères au total. Soit dit en passant, cet exemple particulier fonctionne encore mieux en k5, car nous avons la surcharge "pack" pour /
gérer l'étape de multiplication par un vecteur de coefficients et de sommation:
{(x;4_t;4#t;t:"FizzBuzz")@2 2/~3 5!\:x}'1+!100
Notez également que le comportement de "find" ( ?
), qui produit un index après la fin de la liste de clés si l'élément n'est pas trouvé, est spécifiquement conçu pour prendre en charge la gestion d'un cas "par défaut" dans ce type d'indexation. Considérez ce fragment pour convertir les voyelles en majuscules:
{("AEIOU",x)"aeiou"?x}'
Vers l'un des:
{t:"aeiou"?x;:[t<5;"AEIOU"t;x]}'
{:[~4<t:"aeiou"?x;"AEIOU"t;x]}'
(Je sais que je préfère lire aussi!)