상세 컨텐츠

본문 제목

조건을 만족하는 한 반복하는 함수 「while」

IT & Programming/LISP 공부

by 그림아이 2021. 12. 23. 05:00

본문

반응형

같은 작업을 수동으로 반복하는 것에 혐오감을 가한 경험은 없을까요? 그럴 때는 프로그래밍을 활용하여 자동화해 봅시다.

AutoLISP에서는 "while"이라는 표준 함수로 반복 처리할 수 있습니다. 이번 기사에서는 while에 대해 해설하겠습니다. 귀찮은 작업으로부터 해방되고 싶은 분에게 있어서 유익한 내용이 되고 있으므로 꼭 봐 주세요.

덧붙여서, while 이외에도 「repeat」라고 하는 지정의 횟수만큼 반복 처리를 계속하는 함수가 있습니다.

 

while 동작

while은 조건을 만족하는 한 동일한 처리를 반복하는 함수입니다. 조건은 <, >= 등의 비교 함수를 사용하여 필요한 조건식을 지정합니다. 조건식이 nil을 반환하면(조건을 충족하지 않음) 반복이 종료됩니다. 반대로 말하면 조건식이 nil을 돌려주지 않으면 반복을 계속해 버려, 무한 루프가 되어 버리므로 반드시 nil을 돌려주는 조건식을 지정해 주세요.

 사용예 ① 가로 줄의 원을 5개 작성한다

(setq x 0)
(while (<= x 40)
  (setq center (list x 0))
  (command "circle" center "D" 5)
  (setq x (+ x 10))
)

while로 원을 작성하는 처리를 반복해, 옆 줄의 원을 5개 작성하는 예입니다. while 내에서는 다음 동작이 반복됩니다.

  1. while에서 변수 x가 40 이하인지 판정
  2. 만들 원의 중심 좌표를 변수 center에 저장
  3. 명령 circle을 호출하여 원 만들기
  4. 다음에 작성하는 원의 X 좌표를 산출

X 좌표의 초기 값은 0이므로 처음 생성되는 원의 중심 좌표는 (0,0)입니다. 다음에 작성하는 원의 중심은 X 좌표가 10만 가산되므로 두 번째 원은 (10,0)에 작성됩니다. 덧붙여서 원의 직경은 5입니다.

while의 조건식이 '<= x 40'이므로 변수 x가 40을 초과하면 반복이 종료됩니다. 따라서, 변수 x가 50이 되는 시점, 즉 원을 5개 작성하면 반복은 종료입니다. 출력 결과는 다음과 같습니다.

 

while함수 예제

사용예② 중심을 지정하여 복수의 원을 작성한다

(while (setq center (getpoint "\n원의 중심을 선택합니다."))
  (command "circle" center "D" 5)
)

getpoint로 원의 중심을 취득해 복수의 원을 작성하는 예입니다. 이 예에서는 다음과 같은 동작을 반복합니다.

  1. getpoint로 얻은 좌표를 변수 center에 저장
  2. while로 변수 center가 nil인지 판정
  3. 명령 "circle"을 호출하여 원 만들기

getpoint에서는 화면상에서 임의의 점을 클릭하는 것으로, 그 좌표를 취득할 수 있습니다. 직접 키보드에서 입력해도 됩니다. 취득한 좌표는 변수 center에 저장됩니다.

변수 center가 nil이 되지 않는 한 원의 작성이 반복됩니다. getpoint를 실행할 때 Enter 또는 Esc 키를 누르면 변수 center에 nil이 저장되므로 반복이 종료됩니다.

 

while 서식

while 구문과 인수 및 반환값은 다음과 같습니다.

구문
(while testexpr [expr ...] )
인수
testexpr반복의 연속을 판정하는 조건식.expr 이 nil을 리턴 할 때까지 반복하는 처리. 복수 기술할 수 있어 생략도 가능.
반환값
마지막 평가 결과마지막 expr 결과.

요약

이번 정리

  • while는 조건을 만족하는 한 동일한 처리를 반복한다
  • 조건식이 nil을 반환하면 반복을 종료합니다.
  • nil을 돌려주지 않는 조건식에서는 무한 루프가 된다

 

 

 

 

 

728x90
반응형

'IT & Programming > LISP 공부' 카테고리의 다른 글

AutoLISP의 변수  (0) 2021.12.24
AutoLISP의 문자열 함수  (0) 2021.12.23
동작의 흐름을 조종하라! AutoLISP의 조건 함수 if  (0) 2021.12.23
AutoLISP 비교 연산  (0) 2021.12.22
AutoLISP의 논리 연산 설명  (0) 2021.12.22

관련글 더보기

댓글 영역