문장 및 연산자
DelphiScript 문장
DelphiScript에서 문장은 다른 문장을 포함하지 않을 때 ‘단순(simple)’ 문장으로 간주됩니다. 단순 문장의 예로는 대입문과 프로시저 호출이 있습니다.
Simple statements:
X := Y + 10; // assignment
ShowMessage('Hello World!'); // procedure call
복합(compound) 문장은 여러 개의 문장으로 구성됩니다.
Compound statements:
Begin
If A > B Then ShowMessage('A is bigger');
Else ShowMessage('B is bigger');
A := 0;
B := 0;
End;
조건문
DelphiScript에는 스크립트 내 실행 흐름에 영향을 주는 제어문이 있습니다. 가장 일반적인 제어문은 If..Then 조건문입니다.
If Then 문
If..Then 문은 조건부 제어에 사용됩니다. 구문은 다음과 같습니다:
If Condition Then
Begin
// code here
End
Else
Begin
// code here
End;
Case Of 문
복잡한 If 문 집합을 피하기 위해, 종종 이를 Case 문으로 대체할 수 있습니다. 표현식에서의 case 문은 값 하나, 가능한 값 목록, 또는 값 범위를 선택하는 데 사용됩니다.
DelphiScript는 비정형(untyped) 언어이므로 Case 문에는 어떤 타입이든 사용할 수 있습니다. Case 문에는 Else 문을 포함할 수 있으며, (Case Of 조건 내에서) 어떤 레이블도 선택자(selector)의 값과 일치하지 않을 때 Else 문이 실행됩니다.
Example 1:
Case Char of
'+' : Text := 'Plus sign';
'-' : Text := 'Minus sign';
'*', '/': Text := 'Multiplication or division';
'0'..'9': Text := 'Number';
'a'..'z': Text := 'Lowercase character';
'A'..'Z': Text := 'Uppercase character';
else
Text := 'Unknown character';
End;
Example 2:
Case UserName of
'Jack', 'Joe' : IsAdministrator := true;
'Fred' : IsAdministrator := false;
else
Raise('Unknown User');
End;
With 문
With 문은 DelphiScript의 축약 표기입니다. 레코드 타입 변수(또는 객체)를 참조할 때, 매번 이름을 반복하는 대신 ‘with’ 문을 사용할 수 있습니다.
Normal version:
Form.Canvas.Pen.Width := 2;
Form.Canvas.Pen.Color := clSilver;
Version using With:
With Form.Canvas.Pen do
Begin
Width := 2;
Color := clSilver;
End;
For To Do 루프
For..To..Do 문은 코드 블록(한 줄 이상의 코드)을 반복해서 순회하는 방법을 제공합니다. 기본 구문은 다음과 같습니다:
For counter := start To end Do
Begin
// code here
End;
For 루프는 배열을 초기화하는 데 자주 사용됩니다. For..To..Do 루프의 카운터 방향은 DownTo 키워드를 사용해 루프를 감소(decrement)시키는 방식으로 제어할 수 있습니다. DelphiScript는 For..To..Do 루프를 조기에 종료하기 위한 Break/Exit 문을 제공합니다.
Repeat Until 루프
Repeat 문은 Boolean 표현식이 참이 될 때까지 반복 실행됩니다. Repeat 문은 항상 최소 한 번은 실행됩니다.
Example:
Repeat
Write('Enter a value (0..9): ');
ShowMessage(IntToStr(I));
Until (I >= 0) and (I <= 9);
While Do 루프
While 문은 Repeat 문과 유사하지만, 제어 조건이 문장 시퀀스의 첫 실행 전에 평가된다는 점이 다릅니다. 따라서 조건이 거짓이면 문장 시퀀스는 전혀 실행되지 않습니다.
Example:
Randomize;
I := 0;
While I < 1000 do
Begin
I := I + Random (100);
Add ('Random Number: ' + IntToStr (I));
End;
Continue 문
Continue 문은 Goto 문과 유사하게 루프 본문을 건너뜁니다. continue 문은 실행 중인 스크립트가 현재 For, While 또는 Repeat 루프의 다음 반복(iteration)으로 진행하도록 합니다.
Example:
var
F: File;
i: Integer;
Begin
For i := 0 to (FileListBox1.Items.Count - 1) do
Begin
Try
If FileListBox1.Selected[i] Then
Begin
If not FileExists(FileListBox1.Items.Strings[i]) then
Begin
MessageDlg('File: ' + FileListBox1.Items.Strings[i] + 'not found', mtError, [mbOk], 0);
Continue;
End;
AssignFile(F, FileListBox1.Items.Strings[i]);
Reset(F, 1);
ListBox1.Items.Add(IntToStr(FileSize(F)));
CloseFile(F);
End;
Finally
{ do something here }
End;
End;
End;
Goto 레이블 문
Goto 문은 Goto label 형태이며, 지정된 레이블로 표시된 문장으로 스크립트 실행을 이동시킵니다. 문장을 표시하려면 먼저 레이블을 선언한 다음, 대상 문장 앞에 레이블과 콜론(:)을 붙여야 합니다: label: statement
레이블은 유효한 식별자라면 무엇이든 될 수 있습니다. Label 선언과 Goto 문은 스크립트 내 동일한 코드 블록에 속해야 합니다. 따라서 프로시저나 함수 안으로(또는 밖으로) 점프하는 것은 불가능합니다.
Example:
Label StartHere;
// code
StartHere: Beep;
Goto StartHere;
Exit 문
Exit 문은 함수 또는 프로시저에서 즉시 반환합니다. Try..Finally 블록 내부에서 Exit를 호출하면, 서브루틴이 반환되기 전에 Finally 부분이 실행됩니다. Exit 프로시저가 스크립트의 메인 본문에서 호출된 경우에는 스크립트 실행이 종료됩니다.
Example:
Begin
Server := SchServer;
If Server = Nil Then
Begin
ShowError('No SchServer started');
Exit;
End;
Break 문
Break 문은 실행 중인 스크립트가 현재 For, While 또는 Repeat 루프에서 빠져나오도록 합니다. 스크립트 실행은 현재 루프 다음에 오는 실행 가능한 다음 줄에서 계속됩니다.
Example:
Var
S: string;
Begin
While True do
Begin
ReadLn(S);
Try
if S = '' then Break;
WriteLn(S);
Finally
{ do something for all cases }
End;
End;
End;
DelphiScript 표현식 연산자
일반적으로 표현식은 상수, 변수, 리터럴 값, 연산자, 함수 결과의 유효한 조합입니다. 표현식은 변수에 할당할 값을 결정하거나, 함수의 매개변수를 계산하거나, 조건을 테스트하는 데 사용됩니다. 표현식에는 함수 호출이 포함될 수 있습니다.
DelphiScript에는 여러 논리, 산술, Boolean 및 관계 연산자가 있습니다. 이러한 연산자는 우선순위(아래 참조) 순서로 그룹화되며, 이는 Basic, C 등에서 사용하는 우선순위와 다릅니다. 예를 들어 AND 및 OR 연산자는 관계 연산자보다 우선순위를 가집니다.
a<b and c<d를 작성하면, DelphiScript는 먼저 AND 연산을 수행하여 오류가 발생합니다. 이 문제를 방지하고 우선순위를 정의하려면 각 < 표현식을 괄호로 감싸야 합니다: (a<b) and (c<d);
아래에 나열된 지원되는 DelphiScript 연산자는 우선순위 순서대로 표시되어 있습니다.
우선순위별로 그룹화된 연산자
단항(Unary) 연산자가 가장 높은 우선순위를 가진다는 점에 유의하십시오.
|
Boolean 또는 비트 단위 NOT. |
Multiplicative and Bitwise Operators
* |
산술 곱셈. |
|
부동소수점 나눗셈. |
|
정수 나눗셈. |
|
모듈로(정수 나눗셈의 나머지). |
|
Boolean 또는 비트 단위 AND. |
|
비트 단위 왼쪽 시프트. |
|
비트 단위 오른쪽 시프트. |
Additive Operators
|
산술 덧셈, 문자열 연결. |
- |
산술 뺄셈. |
|
Boolean 또는 비트 단위 OR |
|
Boolean 또는 비트 단위 배타적 OR(EXCLUSIVE OR). |
Relational and Comparison Operators (lowest precedence)
|
같은지 여부 테스트. |
|
같지 않은지 여부 테스트. |
|
보다 작은지 여부 테스트. |
|
보다 큰지 여부 테스트. |
|
작거나 같은지 여부 테스트. |
|
크거나 같은지 여부 테스트. |
또한 ^ 및 @ 연산자는 DelphiScript에서 지원되지 않는다는 점에 유의하십시오.