Koşullardan Kaçının
K, :[
Lisp stiline eşdeğer bir koşullu yapıya ( ) sahiptir cond
:
:[cond1;result1; cond2;result2; cond3;result3; default]
İstediğiniz kadar koşulunuz olabilir ve bunlardan hiçbiri eşleşmezse varsayılan değer döndürülür.
Bazen (özyinelemeli programlarda veya bir dizi yan etkiye dayanan programlarda olduğu gibi), bunlardan birini kullanmanın bir yolu yoktur. Ancak, biraz fazladan iş yapmayı göze alabileceğiniz durumlarda, genellikle bir "cond" i liste indeksleme ile değiştirebilirsiniz.
Kötü şöhretli fizzbuzz programını düşünün . Geleneksel bir zorunluluk programlama tarzında yazılmış, biz ile gidebiliriz:
{:[~x!15;"FizzBuzz";~x!3;"Fizz";~x!5;"Buzz";x]}'1+!100
Bölünebilirlik testlerinde burada biraz tekrar var. Farklı bir yaklaşım, 4 vaka olduğunu (bir sayı, sadece 3'e bölünebilirlik, sadece 5'e bölünebilirlik, 3 ve 5'e bölünebilirlik) olduğunu ve bu vakalardan birini listeden seçen bir dizini doğrudan hesaplamaya çalışır:
{(x;"Fizz";"Buzz";"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
İki karakter daha kısadır ve dili daha iyi kullanır. Liste değişmezlerinin sağdan sola değerlendirildiğini bilerek, yeniden kullanılan alt ifadeleri birleştirmek için bazı ek golf fırsatları da elde ederiz. Dize durumları seçilmedikleri takdirde hiç değerlendirilmediğinden, koşul tabanlı sürümde bunu kolayca yapamazdık:
{(x;4#t;4_ t;t:"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
Şimdi toplamda 5 karakter kaydettik. Bu arada, bu belirli örnek k5'te daha iyi çalışır, çünkü /
bir katsayı vektörü ile çarpma ve toplama adımını işlemek için "paket" aşırı yükümüz vardır:
{(x;4_t;4#t;t:"FizzBuzz")@2 2/~3 5!\:x}'1+!100
Ayrıca ?
, öğe bulunmazsa anahtar listesinin sonundan sonra bir dizin oluşturan "find" ( ) davranışının, bu tür bir dizin oluşturma işleminde "varsayılan" bir vakanın işlenmesini desteklemek üzere özel olarak tasarlandığını unutmayın. Sesli harfleri büyük harfe dönüştürmek için bu parçayı düşünün:
{("AEIOU",x)"aeiou"?x}'
Aşağıdakilerden birine karşı:
{t:"aeiou"?x;:[t<5;"AEIOU"t;x]}'
{:[~4<t:"aeiou"?x;"AEIOU"t;x]}'
(Hangisini de okumayı tercih ettiğimi biliyorum!)