$IF

어떤 조건을 주고 그 조건이 참이면 실행하고, 거짓이면 실행하지 않고 넘어가는 매크로에 대해서 알아보자. 아래 프로그램은 TYPE 이라는 변수를 통해 값이 1이면(EQual) RECTANGLE을 그리고, 2이면 TUBE를 그리게 된다. 그리고, 값이 1이나 2가 아닌 다른 모든값(else)에 대해서는 ELLIP-SOID를 그리게 된다. 아래 프로그램에서는 TYPE=1 이기 때문에 RECTANGLE을 그리게 된다. 우선 프로그램을 한번 실행시켜 보자.

SYSTEM NEW
RESET

TYPE=1

$IF  (TYPE)  EQ  1  THEN
  SURFACE
    PLANE Z
0 RECTANGLE .5 .5
  OBJECT ‘RECT’
$ELSEIF  (TYPE)  EQ  2  THEN
  SURFACE
    TUBE Z
-.2 .5 .5 .2 .5 .5
  OBJECT ‘TUBE’
$ELSE
 
  SURFACE
    ELLIPSOID
.5 .5 .5 0 0 0
  OBJECT ‘SPHERE’
$ENDIF

PLOT FACETS
RETURN

프로그램을 분석하기 전에 먼저 변수에 대해서 알아보자. 위 프로그램에서는 TYPE이라는 변수를 하나 만들었다. 그리고 1이라는 값을 변수 TYPE에 넣었다. 즉, TYPE=1의 뜻은 오른쪽 값 1을 왼쪽의 변수 TYPE에 넣으라는 뜻이다. 만약, 변수를 생성하고 초기화를 시켜주지 않는다면 ASAP은 0으로 변수를 자동 초기화시킨다. ASAP에서 변수를 사용할 때는 공백을 허용하지 않는다. 그래서, 위 프로그램의 변수인 TYPE=1에 공백을 넣어 TYPE = 1 처럼 띄워쓰기를 하면 에러가 발생한다.

ASAP은 변수에 저장된 값을 단독으로 사용할 때 (TYPE) 처럼 변수 이름을 괄호로 묶어 주어야 한다. 그렇지 않으면 또 에러가 발생한다. 변수 이름을 단독으로 사용하지 않고 (TYPE)*2 처럼 어떤 표현의 일부로 변수가 사용될 때는 괄호 없이 TYPE*2 처럼 사용해도 된다. 그리고, 괄호와 동일한 표현법은 변수. 처럼 변수 이름 뒤에 .(마침표)를 찍어주면 된다. 즉, (변수)변수. 은 같은 것으로 인식된다.

Note…
보통 프로그래밍에서 변수를 사용하는 이유는 프로그램 전체에 거쳐 어떤 값을 손쉽게 변경하기 위해서이다.  예를들어, 13이라는 어떤 값을 프로그램 전체의 10곳에서 사용하였다고 하자. 그런데, 조건이 변경되어 13을 15로 바꿔 주어야 하는 경우가 발생하면 보통 10곳에서 모두 값을 변경해 주어야 한다. 그런데, 변수를 사용하면 변수에 넣어준 값을 13에서 15로 한번만 변경해 주면된다. 그러면 프로그램 전체적으로 15가 자동적으로 적용된다.

ASAP에서 사용하는 변수의 이름은 최대 32자까지(7.1버전 이전은 16자) 가능하며, 문자로 시작해야 하는 제약이 있다.

그럼, 이제 본격적으로 $IF에 대해서 알아보자. C/C++과 같은 일반적인 프로그래밍 언어와 달리 ASAP의 $IF 조건문에는 일정한 제약사항이 있다. $IF ~ $ENDIF와 같이 동일 조건하에서의 명령어 그룹들은 세로줄의 시작지점을 동일하게 맞춰주어야 한다. 아래 예제는 $IF, $ELSEIF, $ELSE, $ENDIF가 하나의 동일 조건 묶음이기 때문에 세로줄의 시작지점을 맞추어 주었다. 그리고, $ELSE 아래에 있는 $IF, $ELSE 명령어는 위의 $ELSE 명령어의 하부 조건들로 또 하나의 묶음이기 때문에 이 하부 조건의 세로줄은 들여쓰기를 해야하고, 그 묶음 안에서는 또 세로줄을 맞춰주어야 한다. 위의 조건이 맞지 않으면 에러가 발생하는 경우가 있기 때문이다. 에러없이 돌아가는 경우도 있지만, 혹시 프로그램이 멈추는 현상이 발생한다면 꼭 줄 맞춤을 확인하기 바란다. 들여쓰기가 단순히 보기 편하라고 하는 것만은 아니고, $IF에서는 꼭 맞춰주어야하는 필수 사항이다.

$IF  변수 계연산 THEN
$ELSEIF  변수 관계연산 THEN
$ELSE
      $IF  변수 관계연산 THEN
      $ELSE
$ENDIF

1) $IF  변수 관계연산  THEN
: $IF 매크로에서 처음으로 나와야 하는 조건문으로 $IF 뒤에있는 변수와 값을 관계연산으로 비교하여 참이면 아래의 명령어($IF 아래 라인에서 $ELSEIF 위 라인까지 모두)를 실행하고 거짓이면 그 다음 명령어인 $ELSEIF 조건으로 넘어간다.

2) $ELSEIF 변수 관계연산 THEN
: 마찮가지로 변수와 값을 관계연산으로 비교하여 참이면 아래의 명령어를 실행하고 거짓이면 아래 명령어를 실행하지 않고 다음 조건문으로 또 넘어간다.

3) $ELSE
: 위의 $IF와 $ELSEIF의 조건을 하나도 만족하지 못하면 $ELSE를 만나게 된다. $ELSE를 만나게 되면 $ELSE 다음에 나오는 명령문을 무조건 실행한다. 그래서 $ELSE 명령어에는 아무런 관계연산도 존재하지 않는다. 즉, $IF와 $ELSEIF의 조건을 하나도 만족하지 못했을 때 나머지를 정리하기 위해서 사용하면 된다.

4) $IF 안의 $IF
: $IF나 $ELSEIF, $ELSE 영역 내에 또 다른 $IF 구문을 추가해도 된다. 즉, 조건 안에 또 다른 조건을 넣어도 된다는 뜻이다. 하부 조건의 $IF, $ELSEIF, $ELSE 명령어는 앞에 설명한 방법과 완전히 동일하게 적용된다.

5) $ENDIF
: 모든 실행이 끝나면 $ENDIF를 사용하여 $IF 구문이 끝났음을 알려 주어야 한다.

위의 $IF나 $ELSEIF 중 만족하는 조건이 나오면 그 영역의 명령어를 실행하고, 다음 조건을 검토하지 않고 $IF 구문을 끝내게 되는데 이때 프로그램은 $ELDIF 명령어로 점프하여 $IF 구문을 종료하고 $ENDIF 명령어 다음 라인부터 다시 실행하게 된다.

아래 그림은 위의 각 TYPE에 대한 결과들을 보여주고 있다.

IF_No1
그림 8.6 TYPE=1인 경우

IF_No2
그림 8.7 TYPE=2인 경우

IF_No3
그림 8.8 TYPE=3인 경우 (1,2가 아닌 모든값의 경우)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: