Ended soon
안녕하세요 리습 메이트 고개발이에요! 🐳
일주일 동안 모두들 잘 지내셨나요??
월드컵 응원 열기로 뜨거웠던 한 주였던 거 같아요! ⚽🏆
끝까지 열심히 뛰어준 우리나라 선수들 고생 많으셨습니다!! 👏👏
지난 시간에는 리습의 변수에 대해 알아보았는데요.
오늘은 저 고개발이 준비한 리습 시리즈의 마지막 편인 연산자와 함수에 대해 알아보려고 해요
그럼 리습의 연산자, 조건문, 반복문, 함수에 대해 알아보러 바로 가보자GO!~
리습 코드 연산자
연산자는 수학적 또는 논리적 조작을 수행하도록 지시하는 기호예요.
LISP은 다양한 기능과 매크로, 그리고 데이터에 대한 수많은 작업을 허용하는데요
데이터에 허용되는 작업을 아래와 같이 3가지로 분류해볼 수 있습니다.
- 산술 연산
- 비교 작업
- 논리 연산
그럼 하나씩 살펴보도록 해요!
1. 산술 연산자
A = 10
B = 20 일 때
설명 | 예시 | |
---|---|---|
+ | 두 개의 피연산자를 더합니다. | (+ A B)는 30을 리턴합니다. |
– | 첫 번째 피연산자에서 두 번째 피연산자를 뺍니다. | (- A B)는 -10을 리턴합니다. |
* | 두 피연산자를 곱합니다. | (* A B)는 200을 리턴합니다. |
/ | 첫 번째 피연산자를 두 번째 피연산자로 나눕니다. | (/ B A)는 2를 리턴합니다. |
예시
(setq a 50)
(setq b 20)
(princ (+ a b)) ;; 70
(princ (- a b)) ;; 30
(princ (* a b)) ;; 1000
(princ (/ a b)) ;; 2
2. 비교 연산자
A = 10
B = 20 일 때
* 리습에서 T = true(참), nil = false(거짓) 임
설명 | 예시 | |
---|---|---|
= | 피연산자의 값이 모두 동일한지 확인하고, 일치하면 조건이 참이 됩니다. | (= A B) : nil |
/= | 피연산자의 값이 모두 다른지 확인하고, 값이 같지 않으면 조건이 참이 됩니다. | (/= A B) : T |
> | 피연산자의 값이 갈수록 같거나 감소하는지 확인합니다. | (> A B) : nil |
< | 피연산자의 값이 갈수록 같거나 증가하는지 확인합니다. | (< A B) : T |
>= | 왼쪽 피연산자의 값이 다음 오른쪽 피연산자의 값보다 크거나 같은지 확인하고, 그렇다면 조건이 참이 됩니다. | (>= A B) : nil |
<= | 왼쪽 피연산자의 값이 다음 오른쪽 피연산자의 값보다 작거나 같은지 확인하고, 그렇다면 조건이 참이 됩니다. | (<= A B) : T |
max | 둘 이상의 인수를 비교하여 최댓값을 반환합니다. | (max A B)는 20을 리턴합니다. |
min | 둘 이상의 인수를 비교하여 최솟값을 반환합니다. | (min A B)는 10을 리턴합니다. |
예시
(setq a 50)
(setq b 20)
(princ (= a b)) ;; nil
(princ (/= a b)) ;; T
(princ (> a b)) ;; T
(princ (< a b)) ;; nil
(princ (>= a b)) ;; T
(princ (<= a b)) ;; nil
(princ (max a b)) ;; 50
(princ (min a b)) ;; 20
3. 논리 연산자
A = 10
B = 20 일 때
설명 | 예시 | |
---|---|---|
and | 여러 인수가 필요하며, 인수는 왼쪽에서 오른쪽으로 평가됩니다. 모든 인수가 nil 이 아닌 것으로 평가되면 마지막 인수의 값이 반환됩니다. 그렇지 않은 경우 nil 이 반환됩니다. | (and A B)는 T 를 반환합니다. |
or | 여러 인수가 필요하며, 인수는 nil 이 아닌 것으로 평가될 때까지 왼쪽에서 오른쪽으로 평가됩니다. 이 경우 인수 값이 반환되고, 그렇지 않으면 nil 이 반환됩니다. | (or A B)는 T 를 반환합니다. |
not | 하나의 인수를 취하고 인수가 nil 로 평가되면 T를 반환합니다. | (not A)는 nil 을 반환합니다. |
예시
(setq a 50)
(setq b 20)
(princ (and a b)) ;; T
(princ (or a b)) ;; T
(princ (not a)) ;; nil
조건문
다음은 조건문에 대해 알아보도록 할까요?
“어떤 조건을 만족할 때 ~를 실행하라” 라고 하고 싶을 때 조건문을 작성하게 되는데요.
리습의 조건문에는 크게 2가지가 있어요.
- IF : True or False 로 대답할 수 있는 경우
- COND : 육하원칙으로 대답할 수 있는 경우
기본 구조 : (if testexpr thenexpr [elseexpr])
– testexpr : 조건식
– thenexpr : 조건을 만족할 때
– elseexpr : 조건을 만족하지 않을 때
기본 구조 : (cond [(test1 result1) (test2 result2) (test3 result3) …])
– test1 (조건1) 이 T (참) 일 때 => result1 (결과값1) 실행하고 cond 마침
– test1 이 nil (거짓) 일 때 => test2 (조건2) 확인
예시
(setq a 5)
(setq b 5)
(if (= a b) (princ "같다") (princ "다르다")) ;; 같다
(setq c 5)
(setq d 8)
(cond ((= c d) (princ "같다")) ((< c d) (princ "크다")) (t (princ "거짓"))) ;; 크다
반복문
리습에서 반복문을 배우면 굉장히 다양한 작업을 할 수 있어요.
리습을 사용하는 이유도 결국엔 컴퓨터에게 반복 작업을 대신 시키기 위해서니까요!
반복문도 2가지로 나눠볼 수 있는데요
- REPEAT : 반복 횟수가 정해진 경우
- WHILE : 특정 조건을 만족할 때까지 반복
기본 구조 : (repeat integer [expressions …])
– integer : 반복 횟수 (정수)
– expressions : 실행할 내용들
기본 구조 : (while testexpr [expressions …])
– testexpr : 조건
– expressions : 실행할 내용들
예시
(setq n 0)
(repeat 5
(setq n (+ 1 n))
(princ n)
)
;; 1 2 3 4 5
(setq n 0)
(while (< n 10)
(princ n)
(setq n (+ 1 n))
)
;; 0 1 2 3 4 5 6 7 8 9 10
* 이중 반복문
(setq i 0)
(while (< i n)
(setq x 0)
(setq str " ")
(while (< x n)
(setq
x (+ 1 x)
str (strcat str " " (itoa x))
)
)
(setq i (+ 1 i))
(princ (strcat "n" (itoa i) str))
)
;; 1 1 2 3 4 5 6 7 8 9 10
;; 2 1 2 3 4 5 6 7 8 9 10
;; 3 1 2 3 4 5 6 7 8 9 10
;; 4 1 2 3 4 5 6 7 8 9 10
;; 5 1 2 3 4 5 6 7 8 9 10
;; 6 1 2 3 4 5 6 7 8 9 10
;; 7 1 2 3 4 5 6 7 8 9 10
;; 8 1 2 3 4 5 6 7 8 9 10
;; 9 1 2 3 4 5 6 7 8 9 10
;; 10 1 2 3 4 5 6 7 8 9 10
리습 코드의 함수
마지막으로 알아볼 것은 바로 함수예요.
함수를 선언할 때는 DEfine FUNction 을 따와서 아래 구조로 작성해요.
(DEFUN 함수명()
expr
return value
)
예시
(defun averagenum (n1 n2 n3 n4)
(/ (+ n1 n2 n3 n4) 4)
)
(princ (averagenum 10 20 30 40))
;; 25
대표적인 함수 몇 개를 살펴볼까요?
1. setvar : 시스템 변수를 설정하는 함수
기본 구조 : (setvar “시스템변수” 값)
-> 시스템변수를 값으로 설정하라
2. getpoint : 좌표를 입력 받는 함수
기본 구조 : (getpoint)
-> 좌표를 입력 받아라
활용 예시 : (setq p1 (getpoint “n첫 번째 점을 입력하세요: “))
① 줄 바꾸고 “첫 번째 점을 입력하세요” 라는 문구를 띄우고 (*n : 줄 바꿈)
② 좌표를 입력 받아
③ 그 좌표를 p1에 저장하라
3. ssget : 여러 객체를 선택할 수 있는 함수
기본 구조 : (ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list])
[sel-method] : 객체 선택 방법
4. command : AutoCAD의 명령어를 활용하여 지정한 명령을 순차적으로 실행시키는 함수
※ 주의사항 : AutoCAD 명령어는 단축키 (alias) 가 아닌 full 명칭으로 입력해야 돼요!
(command “line” …) (O)
(command “l” …) (X)
(command “circle” …) (O)
(command “c” …) (X)
기본 구조 : (command “명령어” A B C D …)
-> 명령어 를 오토캐드 명령 실행 순서대로 실행
예시
;;c_line1;;(defun c:CEP(/ ss1 ss2 ss3)
;;c_line2;;(setvar "cmdecho" 0)
;;c_line3;; (setq p1 (getpoint "n첫 번째 점을 입력하세요: "))
;;c_line4;; (setq p2 (getpoint p1 "n두 번째 점을 입력하세요: "))
;;c_line5;; (setq p3 (getpoint p1 "n세 번째 점을 입력하세요: "))
;;c_line6;; (command "line" p1 p2 "")
;;c_line7;; (setq ss1 (ssget))
;;c_line8;; (command "change" ss1 "" "p" "c" "1" "")
;;c_line9;; (command "circle" "2p" p1 p2)
;;c_line10;; (setq ss2 (ssget))
;;c_line11;; (command "chprop" ss2 "" "p" "c" "2" "")
;;c_line12;; (command "rectangle" p3 pause)
;;c_line13;; (setq ss3 (ssget))
;;c_line14;; (command "change" ss3 "" "p" "c" "3" "")
;;c_line15;;)
예시 설명
- c_line1 : “CEP” 함수를 정의함. CEP 함수 실행이 완료되면 ss1 ss2 ss3 로컬 변수는 초기화
- c_line2 : “cmdecho” 환경 변수 값을 0으로 설정 – 리습이 실행되는 동안 실행한 내용과 값을 명령행에 표시할지를 제어 [1 (기본값) : 표시 / 0 : 표시 안 함]
- c_line3 : 첫 번째 점을 입력하여 p1 에 저장
- c_line4 : 두 번째 점을 입력하여 p2 에 저장
getpoint 와 메세지 사이에 p1을 넣으면
p1 부터 p2 까지의 rubber-band line (가상의 선)을 점선으로 보여줍니다!
- c_line5 : 세 번째 점을 입력하여 p3 에 저장
- c_line6 : LINE 명령을 실행 – p1 (첫 번째 입력하여 저장한 점) -> p2 (두 번째 입력하여 저장한 점) -> “” (엔터로 line 명령 종료)
- c_line7 : 객체를 선택하여 (ssget) ss1 로 저장. line 객체 선택
- c_line8 : CHANGE 명령을 실행 – 변경할 객체로 ss1 로 저장한 line -> “” (객체 선택 완료) -> “p” (특성) -> “c” (색상) -> “1″ (red) -> “” (명령 종료)
- c_line9 : CIRCLE 명령을 실행 – 2p (2점 선택) -> p1 (첫 번째 입력하여 저장한 점) -> p2 (두 번째 입력하여 저장한 점)
- c_line10 : 객체를 선택하여 (ssget) ss2 로 저장. circle 객체 선택
- c_line11 : CHPROP 명령을 실행 – 변경할 객체로 ss2 로 저장한 circle -> “” (객체 선택 완료) -> “p” (특성) -> “c” (색상) -> “2″ (yellow) -> “” (명령 종료)
- c_line12 : RECTANGLE 명령을 실행 – p3 (세 번째 입력하여 저장한 점) -> pause (사용자의 입력을 기다림. rectangle 의 다른 구석점을 지정)
- c_line13 : 객체를 선택하여 (ssget) ss3 로 저장. rectangle 객체 선택
- c_line14 : CHANGE 명령을 실행 – 변경할 객체로 ss3 로 저장한 line -> “” (객체 선택 완료) -> “p” (특성) -> “c” (색상) -> “3″ (green) -> “” (명령 종료)
- c_line15 : 리습 종료
오늘은 리습의 연산자와 조건문, 반복문 그리고 마지막으로 함수에 대해 알아보았어요!
많이 어렵지 않은 예시로 어떻게 사용하면 되는지 설명드렸는데요 도움이 되었길 바라요! 🙏
지금까지 AutoLISP에 대해 꽤 많은 내용을 배워봤는데 어떠셨나요??
- 리습의 개념
- 리습의 기본 구조
- 변수
- 연산자
- 조건문
- 반복문
- 함수
그동안 알 수 없는 코드들만 보면 막막했던 분들께
‘이제는 리습을 조금은 받아들일 수 있겠다’
‘나도 한번 해볼 수 있을 거 같은데?’
정도의 마음을 싹틔웠다면 저 고개발은 정말 정말 만족합니다!! 😆
지금까지 배운 내용들을 틈틈이 복습하시면서 모르는 내용이 있으시면
오른쪽 상단의 질문하기 또는 고개발의 연구소 에 오셔서 질문 남겨주세요~
고개발이 아는 범위 내에서는 최선을 다해 답변드리겠습니다~!!
그럼 다음에 또 다른 컨텐츠로 만나요~! 🖐
유익한 정보 감사합니다
너무 유익하게 잘 봤습니다. 감사합니다