ทำ

ฟังก์ชัน do ใน Scheme เป็นกลไกการวนซ้ำที่ช่วยให้สามารถวนซ้ำด้วยเงื่อนไขการเริ่มต้น การอัปเดต และการยกเลิก มีประโยชน์อย่างยิ่งเมื่อคุณจำเป็นต้องดำเนินการตามลำดับของการดำเนินการตามจำนวนครั้งที่กำหนดหรือจนกว่าจะตรงตามเงื่อนไข

รูปแบบทั่วไปของ do คือ:

(do ((var1 init1 update1)
     (var2 init2 update2)
     (var3 init3 update3))
    (termination-condition result)
  body)
  • ตัวแปร: ตัวแปรลูป
  • ค่าเริ่มต้น: ค่าเริ่มต้นของตัวแปรลูปแต่ละตัว
  • Update-expression: นิพจน์เพื่ออัปเดตตัวแปรลูปเมื่อสิ้นสุดการวนซ้ำแต่ละครั้ง
  • Termination-condition: เงื่อนไขในการหยุดการวนซ้ำ
  • Result-expression: ค่าที่จะส่งคืนเมื่อการวนซ้ำสิ้นสุดลง
  • เนื้อหา: โค้ดที่จะดำเนินการในการวนซ้ำแต่ละครั้ง

ตัวอย่าง: รวมตัวเลขตั้งแต่ 1 ถึง 5

(do ((i 1 (+ i 1))      ; Initialize i to 1, increment by 1
     (sum 0 (+ sum i))) ; Initialize sum to 0, add i to sum
    ((> i 5) sum)       ; Terminate when i > 5, return sum
  (lumi-message (number->string sum))) ; Print sum at each step
  • ตัวแปรลูป i เริ่มต้นที่ 1 และเพิ่มขึ้นทีละ 1 ในแต่ละการวนซ้ำ
  • ตัวแปร sum จะสะสมผลรวมของ i
  • การวนซ้ำจะสิ้นสุดลงเมื่อ i > 5 ส่งคืนค่าสุดท้ายของ sum

เอาต์พุต: 15


มันทำงานอย่างไร

  1. การเริ่มต้น:

    • ตัวแปรลูปแต่ละตัวถูกกำหนดค่าเริ่มต้น
  2. การตรวจสอบการสิ้นสุด:

    • เมื่อเริ่มต้นการวนซ้ำแต่ละครั้ง จะมีการตรวจสอบเงื่อนไขการสิ้นสุด หากเป็นจริง การวนซ้ำจะหยุดและนิพจน์ผลลัพธ์จะถูกประเมิน
  3. การทำซ้ำ:

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

สรุป

  • โครงสร้าง do มอบวิธีที่ยืดหยุ่นในการใช้งานลูปที่มีตัวแปรหลายตัวและเงื่อนไขการยกเลิกที่ซับซ้อน
  • มีประโยชน์สำหรับงานที่ต้องการการอัปเดตสถานะในการวนซ้ำ
  • เงื่อนไขการสิ้นสุดจะกำหนดเมื่อลูปสิ้นสุดและสามารถส่งคืนผลลัพธ์สุดท้ายได้

เมื่อใช้ do คุณจะสามารถนำอัลกอริธึมแบบวนซ้ำใน Scheme ไปใช้ได้ด้วยการควบคุมการเริ่มต้น การอัปเดต และการยุติที่แม่นยำ ซึ่งทำให้ do เป็นการผสมผสานระหว่าง กลไกการเชื่อมโยงที่กำหนดขอบเขต (เช่น let) และ โครงสร้างการควบคุมแบบวนซ้ำ ทำให้สามารถจัดการกับการวนซ้ำและสถานะชั่วคราวในลักษณะที่กระชับและชัดเจน