Hindari Persyaratan
K memiliki konstruksi kondisional ( :[
) yang setara dengan gaya Lisp cond
:
:[cond1;result1; cond2;result2; cond3;result3; default]
Anda dapat memiliki kondisi sebanyak yang Anda suka, dan jika tidak ada yang cocok dengan nilai default dikembalikan.
Kadang-kadang (seperti pada program rekursif atau program yang sebaliknya bergantung pada urutan efek samping), tidak ada jalan untuk menggunakan salah satunya. Namun, dalam situasi di mana Anda mampu melakukan sedikit pekerjaan tambahan, Anda sering dapat mengganti "cond" dengan pengindeksan daftar.
Pertimbangkan program fizzbuzz yang terkenal . Ditulis dengan gaya pemrograman imperatif konvensional, kita dapat menggunakan:
{:[~x!15;"FizzBuzz";~x!3;"Fizz";~x!5;"Buzz";x]}'1+!100
Ada sedikit pengulangan di sini di tes keterbagian. Pendekatan yang berbeda mengakui bahwa ada 4 kasus (angka, dapat dibagi dengan hanya 3, dapat dibagi dengan hanya 5, dapat dibagi dengan 3 dan 5) dan upaya untuk secara langsung menghitung indeks yang memilih salah satu kasus ini dari daftar:
{(x;"Fizz";"Buzz";"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
Dua karakter lebih pendek, dan penggunaan bahasa yang lebih baik. Mengetahui bahwa literal daftar dievaluasi dari kanan ke kiri, kami juga mendapatkan beberapa peluang golf tambahan untuk menggabungkan subekspresi yang digunakan kembali. Kami tidak dapat dengan mudah melakukan ini dalam versi berbasis-cond, karena case string tidak dievaluasi sama sekali jika mereka tidak dipilih:
{(x;4#t;4_ t;t:"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
Sekarang kami telah menyimpan 5 karakter secara keseluruhan. Secara kebetulan, contoh khusus ini bekerja lebih baik lagi di k5, karena kita memiliki "paket" berlebihan untuk /
menangani langkah mengalikan dengan vektor koefisien dan menjumlahkan:
{(x;4_t;4#t;t:"FizzBuzz")@2 2/~3 5!\:x}'1+!100
Perhatikan juga bahwa perilaku "find" ( ?
), yang menghasilkan indeks melewati akhir daftar kunci jika item tidak ditemukan, secara khusus dirancang untuk mendukung penanganan kasus "default" dalam jenis pengindeksan ini. Pertimbangkan fragmen ini untuk mengonversi vokal menjadi huruf besar:
{("AEIOU",x)"aeiou"?x}'
Lawan satu dari:
{t:"aeiou"?x;:[t<5;"AEIOU"t;x]}'
{:[~4<t:"aeiou"?x;"AEIOU"t;x]}'
(Saya tahu mana yang saya lebih suka baca juga!)