행복감-흐름 제어

프로그램 실행 흐름은 프로그램 문이 실행되는 순서를 나타냅니다. 기본적으로 명령문은 차례로 실행됩니다.

하나; 작업을 완료하려면 여러 번 실행 순서를 기본 순서에서 변경해야합니다.

Euphoria에는 명령문의 실행 순서를 정렬하는 데 사용할 수 있는 여러 흐름 제어 명령문이 있습니다.

출구

루프 종료는 키워드로 수행됩니다. exit. 이로 인해 흐름은 즉시 현재 루프를 떠나 루프가 끝났을 때 첫 번째 문으로 다시 시작됩니다.

통사론

종료 문의 구문은 다음과 같습니다.

exit [ "Label Name" ] [Number]

그만큼 exit 문은 선택적 레이블 이름 또는 번호가 지정 될 때까지 가장 최근의 가장 안쪽 루프를 종료합니다.

특별한 형태의 exit N 이다 exit 0. 이렇게하면 깊이에 관계없이 모든 수준의 루프가 남습니다. 제어는 가장 바깥 쪽 루프 블록 이후에 계속됩니다. 마찬가지로 exit -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 문이나 switch 문에 적용됩니다.

통사론

break 문의 구문은 다음과 같습니다.

break [ "Label Name" ] [Number]

그만큼 break 문은 선택적 레이블 이름 또는 번호가 지정 될 때까지 가장 최근의 가장 안쪽 if 또는 switch 블록을 종료합니다.

특별한 형태의 break N 이다 break 0. 이것은 깊이에 관계없이 가장 바깥 쪽 if 또는 switch 블록을 남깁니다. 제어는 가장 바깥 쪽 블록 이후에 계속됩니다. 마찬가지로 break -1은 두 번째 가장 바깥 쪽 if 또는 switch 블록을 끊습니다.

#!/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 문의 구문은 다음과 같습니다.

continue [ "Label Name" ] [Number]

그만큼 continue 문은 선택적 레이블 이름 또는 번호가 지정 될 때까지 최신 및 내부 대부분의 루프를 다시 반복합니다.

특별한 형태의 continue N 이다 continue 0. 이것은 깊이에 관계없이 가장 바깥 쪽 루프를 다시 반복합니다. 마찬가지로 continue -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 [ "Label Name" ] [Number]

그만큼 retry문이 적용되는 루프의 현재 반복 실행을 재 시도합니다. 명령문은 지정된 루프의 첫 번째 명령문으로 분기되며 어떤 것도 테스트하지 않고 for 루프 인덱스를 증가 시키지도 않습니다.

특별한 형태의 retry N 이다 retry 0. 이것은 깊이에 관계없이 가장 바깥 쪽 루프 실행을 재 시도합니다. 마찬가지로 retry -1은 두 번째 가장 바깥 쪽 루프를 다시 시도합니다.

일반적으로 retry 문을 포함하는 하위 블록에는 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

retry는 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