ความอิ่มอกอิ่มใจ - การควบคุมการไหล

ขั้นตอนการดำเนินการโปรแกรมหมายถึงลำดับที่คำสั่งโปรแกรมได้รับ ตามค่าเริ่มต้นคำสั่งจะดำเนินการทีละรายการ

อย่างไรก็ตาม; หลายครั้งต้องเปลี่ยนลำดับการดำเนินการจากคำสั่งเริ่มต้นเพื่อให้งานสำเร็จลุล่วง

Euphoria มีคำสั่งควบคุมการไหลจำนวนหนึ่งที่คุณสามารถใช้เพื่อจัดเรียงลำดับการดำเนินการของคำสั่ง

ทางออกคำสั่ง

การออกจากลูปทำได้ด้วยคีย์เวิร์ด exit. สิ่งนี้ทำให้โฟลว์ออกจากลูปปัจจุบันทันทีและเริ่มต้นใหม่ด้วยคำสั่งแรกหลังจากสิ้นสุดลูป

ไวยากรณ์

ไวยากรณ์ของคำสั่ง exit มีดังนี้ -

exit [ "Label Name" ] [Number]

exit คำสั่งยกเลิกลูปล่าสุดและด้านในสุดจนกว่าจะระบุชื่อป้ายกำกับหรือหมายเลขที่เป็นทางเลือก

รูปแบบพิเศษของ exit N คือ exit 0. สิ่งนี้จะออกจากทุกระดับของการวนซ้ำโดยไม่คำนึงถึงความลึก การควบคุมดำเนินต่อไปหลังจากบล็อกลูปด้านนอกสุด ในทำนองเดียวกันทางออก -1 จะออกจากวงนอกสุดที่สองและอื่น ๆ

ตัวอย่าง

#!/home/euphoria-4.0b2/bin/eui

integer b

for a = 1 to 16 do
   printf(1, "value of a %d\n", a)
   
   if a = 10 then
      b = a
      exit
   end if
end for

printf(1, "value of b %d\n", b)

สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -

value of a 1
value of a 2
value of a 3
value of a 4
value of a 5
value of a 6
value of a 7
value of a 8
value of a 9
value of a 10
value of b 10

แบ่งคำสั่ง

break คำสั่งทำงานเหมือนกับไฟล์ exit แต่ใช้กับ if statement หรือ switch statement แทนที่จะใช้ loop statement ประเภทใดก็ได้

ไวยากรณ์

ไวยากรณ์ของคำสั่ง break มีดังนี้ -

break [ "Label Name" ] [Number]

break คำสั่งยกเลิกบล็อกล่าสุดและด้านในสุดถ้าหรือสลับบล็อกจนกว่าจะระบุชื่อป้ายกำกับหรือหมายเลขที่เป็นทางเลือก

รูปแบบพิเศษของ break N คือ break 0. สิ่งนี้จะทำให้บล็อก if หรือสวิตช์ด้านนอกมากที่สุดโดยไม่คำนึงถึงความลึก การควบคุมดำเนินต่อไปหลังจากบล็อกด้านนอกสุด ในทำนองเดียวกัน break -1 จะแบ่งด้านนอกสุดที่สองถ้าหรือสลับบล็อกและอื่น ๆ

ตัวอย่าง

#!/home/euphoria-4.0b2/bin/eui

integer a, b
sequence s = {'E','u', 'p'}

if s[1] = 'E' then
   a = 3
   
   if s[2] = 'u' then
      b = 1
      if s[3] = 'p' then
         break 0 -- leave topmost if block
      end if
      a = 2
   else
      b = 4
   end if
else
   a = 0
   b = 0
end if

printf(1, "value of a %d\n", a)
printf(1, "value of b %d\n", b)

สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -

value of a 3
value of b 1

ยังคงคำสั่ง

continue คำสั่งยังคงดำเนินการวนซ้ำที่จะนำไปใช้โดยไปที่การวนซ้ำถัดไปและข้ามส่วนที่เหลือของการวนซ้ำ

การทำซ้ำครั้งถัดไปหมายถึงการทดสอบดัชนีตัวแปรเงื่อนไขและตรวจสอบว่ายังอยู่ในขอบเขตหรือไม่

ไวยากรณ์

ไวยากรณ์ของคำสั่งต่อมีดังนี้ -

continue [ "Label Name" ] [Number]

continue คำสั่งจะวนซ้ำวนรอบล่าสุดและด้านในสุดจนกว่าจะระบุชื่อป้ายกำกับหรือหมายเลขที่เป็นทางเลือก

รูปแบบพิเศษของ continue N คือ continue 0. การทำเช่นนี้จะวนซ้ำรอบนอกสุดโดยไม่คำนึงถึงความลึก ในทำนองเดียวกันต่อ -1 เริ่มต้นจากวงนอกสุดที่สองไปเรื่อย ๆ

ตัวอย่าง

#!/home/euphoria-4.0b2/bin/eui

for a = 3 to 6 do
   printf(1, "value of a %d\n", a)

   if a = 4 then
      puts(1,"(2)\n")
      continue
   end if

   printf(1, "value of a %d\n", a*a)
end for
This would produce following result:

value of a 3
value of a 9
value of a 4
(2)
value of a 5
value of a 25
value of a 6
value of a 36

ลองใหม่อีกครั้งคำสั่ง

retry คำสั่งยังคงดำเนินการวนซ้ำที่จะนำไปใช้โดยไปที่การวนซ้ำถัดไปและข้ามส่วนที่เหลือของการวนซ้ำ

ไวยากรณ์

ไวยากรณ์ของคำสั่ง retry มีดังนี้ -

retry [ "Label Name" ] [Number]

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

รูปแบบพิเศษของ retry N คือ retry 0. การดำเนินการนี้จะพยายามดำเนินการวนรอบนอกสุดโดยไม่คำนึงถึงความลึก ในทำนองเดียวกันลองอีกครั้ง -1 ลองซ้ำวงนอกสุดที่สองและอื่น ๆ

โดยปกติบล็อกย่อยที่มีคำสั่งการลองใหม่จะมีคีย์เวิร์ดควบคุมโฟลว์อื่นเช่น exit, Continue หรือ break มิฉะนั้นการทำซ้ำจะดำเนินการอย่างไม่มีที่สิ้นสุด

ตัวอย่าง

#!/home/euphoria-4.0b2/bin/eui

integer errors = 0
integer files_to_open = 10

for i = 1 to length(files_to_open) do
   fh = open(files_to_open[i], "rb")
   
   if fh = -1 then
      if errors > 5 then
         exit
      else
         errors += 1
         retry
      end if
   end if
   file_handles[i] = fh
end for

เนื่องจากการลองใหม่จะไม่เปลี่ยนค่าของ i และลองเปิดไฟล์เดียวกันอีกครั้งจึงต้องมีวิธีแยกออกจากลูปซึ่งคำสั่ง exit มีให้

คำสั่ง goto

goto คำสั่งสั่งให้คอมพิวเตอร์ดำเนินการเรียกใช้โค้ดต่อในตำแหน่งที่มีป้ายกำกับ

สถานที่ในการดำเนินการต่อเรียกว่าเป้าหมายของคำสั่ง ถูก จำกัด ให้อยู่ในกิจวัตรปัจจุบันหรือไฟล์ปัจจุบันหากอยู่นอกกิจวัตรใด ๆ

ไวยากรณ์

ไวยากรณ์ของคำสั่ง goto มีดังนี้ -

goto "Label Name"

เป้าหมายของคำสั่ง goto สามารถเข้าถึงได้ label คำสั่ง -

label "Label Name"

ชื่อป้ายกำกับต้องเป็นสตริงค่าคงที่ที่ยกมาสองครั้ง อักขระที่ผิดกฎหมายในตัวระบุ Euphoria อาจปรากฏในชื่อป้ายกำกับเนื่องจากเป็นสตริงปกติ

ตัวอย่าง

#!/home/euphoria-4.0b2/bin/eui

integer a = 0

label "FIRST"
printf(1, "value of a %d\n", a)
a += 10

if a < 50 then
   goto "FIRST"
end if 
printf(1, "Final value of a %d\n", a)

สิ่งนี้ก่อให้เกิดผลลัพธ์ดังต่อไปนี้ -

value of a 0
value of a 10
value of a 20
value of a 30
value of a 40
Final value of a 50