1. 조건 및 반복 함수
리습(Lisp)에서 조건을 사용하여 원하는 동작과 데이터 처리를 위해 여러 함수를 사용합니다. 조건과 반복 횟수를 적절히 사용하면 다양한 구문을 작성할 수 있는데요. 오늘은 조건 및 반복 함수 Repeat, If, Progn, Cond, While 에 대해서 살펴보겠습니다.
1) Repeat
(Repeat int(정수) (실행문))
지정된 횟수(정수)만큼 실행문을 반복합니다. 이때 정수는 정수를 대체할 수 있는 변수도 사용할 수 있습니다.(setq x 0 y 0)
(setq n 10)
(repeat n (setq pt (LIST x y))(command "circle" pt "5")(setq x (+ 10 x)))
반복 횟수를 지정하는 변수 n에 10을 저장하고 실행횟수를 10으로 지정합니다. Repeat 함수를 실행하여 실행문을 10회 반복합니다.
2) IF 함수
(If (조건) (실행문1)(실행문2))
조건이 참이면 실행문 1을 실행하고, 조건이 거짓이면 실행문 2를 실행합니다. 거짓에 대한 실행문은 생략이 가능합니다.
<조건문 예시>
① a=b ▶ (= a b) : a와 b가 같다면,
② a>b ▶ (> a b) : a가 b보다 크다면,
③ ab ▶ (/= a b) : a와 b가 다르다면,
⑤ a>=b ▶ (>= a b) : a가 b보다 크거나 같다면,
⑥ a<=b ▶ (<= a b) : a가 b보다 작거나 같다면,
<예시>(SETQ A 1 B 2)
(IF (> A B) (PROMPT "참입니다.")(PROMPT "거짓입니다."))(PRINC)
조건 A>B 가 거짓이므로 실행문2를 실행하여 “거짓입니다.”를 호출합니다.
3) Progn 함수
(If (조건) (Progn (실행문1) (…….) ) (Progn(실행문2) (….…)))
앞서 다룬 IF 함수의 구조는 (IF (조건) (실행문1) (실행문2)) 형태로 작동합니다. 이때 실행문에 여러 동작을 작성하려면 구문의 길이가 길어지게 됩니다. If 함수는 뒤에 오는 1번째 구문을 참 실행문 2번째 구문을 거짓 실행문으로 인식합니다. 동작을 위해서 괄호가 늘어나면 If 함수는 오류가 발생하는데요. 이때 Progn 함수로 참 실행문, 거짓 실행문 그룹을 나누면 If 함수가 오류 없이 작동합니다.
<예시>(SETQ A 1 B 2)
(IF (> A B)
(Progn (Setq C 10) (Setq D 20))
(Progn (Setq C 20) (Setq D 40))
)
만약 Progn 함수를 사용하지 않고 변수 C, D를 지정하면 괄호의 개수가 맞지 않아 에러가 발생합니다. 이처럼 Progn 함수는 If 함수와 같이 참 또는 거짓의 실행문에 다양한 구문을 구분 지어 주기 위해 사용하는 함수입니다. 조건에 맞는 구문 실행을 위해 Progn 구문을 이용하면 다양한 동작을 구현할 수 있습니다.
4) Cond
(Cond ((조건문1)(실행문1)) ((조건문2)(실행문2))…..(t nill))
If 함수와 비슷한 함수로 여러 조건을 실행할 때 유용한 함수입니다. 각 조건을 만족할 때 구문을 실행합니다.
<예시>(Setq str(getstring "\ YES(Y) or No(N)…..:"))
(Cond ((= str "Y")(setq aa 1)) ((= str "y")(setq aa 1)) ((= str "N")(setq aa 0)) ((= str "n")(setq aa 0)) (t nill))
대소문자 구분 없이 Y를 입력하면 aa 변수에 1을 입력하고 N을 입력하면 aa 변수에 0이 저장됩니다. 조건을 만족하는 값이 없으면 nill을 반환합니다.
5) While
(While (조건문) (실행문))
조건문을 만족할 때까지 실행문을 반복하는 함수입니다. If 함수처럼 조건식을 사용할 수 있으며, 조건이 nill을 반환하면 종료됩니다. While 함수를 사용하여 구문 작성 시 nill이 반환되지 않으면 무한 반복되니 주의하시기 바랍니다.
<예시>(setq x 0 y 0)
(while (< x 100)
(Setq pt (LIST x y))
(Command "circle" pt "5")
(Setq x (+ 10 x)))
x와 y를 변수 0으로 지정하여 리스트 (0, 0)을 생성합니다. 생성된 리스트 pt를 중심으로 반지름이 “5”인 원을 생성합니다. 또한 x 좌표를 10mm씩 증가시켜 원을 생성하고 x 좌표가 100mm 미만이 되면 원 생성을 중지합니다.