หลีกเลี่ยงเงื่อนไข
K มีโครงสร้างแบบมีเงื่อนไข ( :[
) ซึ่งเทียบเท่ากับ Lisp-style 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
ตัวละครสองตัวสั้นกว่าและใช้ภาษาได้ดีกว่า การรู้ว่ารายการตัวอักษรได้รับการประเมินจากขวาไปซ้ายเรายังได้รับโอกาสในการเล่นกอล์ฟเพิ่มเติมสำหรับการรวม subexpressions ที่นำกลับมาใช้ใหม่ เราไม่สามารถทำสิ่งนี้ได้อย่างง่ายดายในเวอร์ชันที่ใช้ cond เนื่องจากกรณีสตริงจะไม่ถูกประเมินเลยหากไม่ได้เลือก:
{(x;4#t;4_ t;t:"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
ตอนนี้เราได้บันทึกตัวละคร 5 ตัวโดยรวมแล้ว ตัวอย่างนี้ทำงานได้ดีกว่าแม้ใน k5 เนื่องจากเรามี "แพ็ค" เกินพิกัดสำหรับ/
จัดการขั้นตอนการคูณด้วยเวกเตอร์ของสัมประสิทธิ์และการรวม:
{(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]}'
(ฉันรู้ว่าฉันอ่านอะไรดีด้วย!)