เมื่อไร

ใน Scheme แม้ว่า if จะดูหรูหราและใช้งานได้หลากหลาย แต่อาจทำให้เกิดความสับสนได้เมื่อใช้โดยไม่มี else ที่ชัดเจน สิ่งนี้จะเกิดขึ้นจริงโดยเฉพาะอย่างยิ่งเมื่อมีความตั้งใจที่จะรันโค้ดสาขาเดียวเฉพาะเมื่อเงื่อนไขเป็นจริงเท่านั้น โดยไม่มีการดำเนินการอื่นสำหรับ false case ในสถานการณ์เช่นนี้ โครงสร้าง when มอบทางเลือกที่ชัดเจนและกระชับยิ่งขึ้น

รูปแบบพื้นฐานของ when มีลักษณะดังนี้:

(when test-is-true
  do-this
  do-that)
  • หาก test ประเมินเป็นจริง (#t) นิพจน์ทั้งหมดในส่วนเนื้อหาของ when โครงสร้างจะถูกดำเนินการตามลำดับ
  • หาก test ประเมินเป็นเท็จ (#f) แสดงว่าไม่มีอะไรเกิดขึ้น และไม่มีการส่งคืนค่าใด ๆ

ตัวอย่าง

(when (< 0 1)
  (lumi-message "Condition is true!")
  (lumi-message "Executing additional actions."))

ตัดกัน if และ when

เพื่อให้เข้าใจความแตกต่างระหว่าง if และ when ได้ดียิ่งขึ้น โปรดพิจารณาตัวอย่างต่อไปนี้ที่ใช้ทั้งสองอย่างร่วมกัน:

(if (= 0 1)
  (lumi-message "This will not run")
  (when (< 0 1)
    (lumi-message "The 'when' condition is true!")
    (lumi-message "Executing multiple actions within 'when'.")))

คำอธิบาย:

  1. เงื่อนไข if:

    • การทดสอบ (= 0 1) ตรวจสอบว่า 0 เท่ากับ 1 หรือไม่
    • เนื่องจากนี่เป็นเท็จ (#f) สาขา else ของ if จึงถูกดำเนินการ
  2. ** when สร้างในสาขา else**:

    • การทดสอบ when (< 0 1) ตรวจสอบว่า 0 น้อยกว่า 1 หรือไม่
    • เนื่องจากสิ่งนี้เป็นจริง (#t) นิพจน์ทั้งหมดภายในเนื้อหาของ when จะถูกดำเนินการตามลำดับ:
      • First, it prints "The 'when' condition is true!".
      • Then, it prints "Executing multiple actions within 'when'.".

ทำไมต้องใช้ when ที่นี่

  • การใช้ when แทน if อื่นจะช่วยลดความซับซ้อนของตรรกะเมื่อไม่จำเป็นต้องใช้สาขา else ที่ชัดเจนสำหรับเงื่อนไข
  • when ทำให้ชัดเจนว่าเฉพาะสาขาที่แท้จริงเท่านั้นที่เกี่ยวข้อง ช่วยลดความสับสนที่อาจเกิดขึ้น

สรุป

  • ใช้ if เมื่อคุณต้องการทั้งสาขาจริงและเท็จ
  • ใช้ when เมื่อกรณีจริงมีเพียงสาขาเดียว โดยเฉพาะอย่างยิ่งเมื่อจำเป็นต้องดำเนินการหลายอย่าง
  • การรวม if และ when เข้าด้วยกันสามารถช่วยจัดโครงสร้างเงื่อนไขที่ซับซ้อนมากขึ้นได้อย่างชัดเจนและกระชับ