안녕하세요 리습 메이트 고개발이에요! 🐳
혹시 지난 주 고개발의 리습 시리즈 기다리신 분들 있었나요?
밀리지 않고 매주 화요일에 찾아오려고 노력했는데 현생에 치여서 그만…
한주간 정비하고 돌아왔습니다..!
앞으로는 건너뛰지 않고 꾸준히 찾아올 수 있도록 고개발 열심히 노력할게요!! ✍
지난 시간에는 리습은 어떻게 짜는지 '리습의 기본 구조'에 대해 배워보았는데요
큰 틀만 이해하고 넘어가면 충분하다고는 했지만 중간중간에 나오는 생소한 용어 때문에 어려웠던 유저분들도 있었을 거예요
오늘은 지난 번에 조금 어렵게 느껴졌던 부분을 한 발짝 더 자세히 들어가서 살펴보도록 해요!
그럼 리습의 변수에 대해 알아보러 출발! Let's GO!
변수의 선언
변수를 선언하기 위해서 리습에서는 setq 라는 함수를 사용합니다.
setq 함수 : 변수 값을 할당하는 함수
기본 구조 : (setq variable_name_1 value_1 [variable_name_2 value_2 …])
- 변수(variable_name) 에 value 값을 저장
- value 에는 특정 값을 지정할 수도 있고, 표현식을 지정할 수도 있음
- [ ] 안의 요소는 생략 가능
setq 예시
(setq a 3 b 3.875 c "test")
변수에 값이 잘 저장되었는지 확인하고 싶을 땐 !변수 를 입력하면 됐었죠? (혹시 까먹은 분들은 이전화 복습하고 오기~!)
각각의 변수에 값이 잘 저장된 것을 확인할 수 있어요!
예시를 하나만 더 살펴볼까요?
(setq x (getpoint "x에 사용할 점을 클릭하세요"))
setq 에서 표현식도 쓸 수 있다고 했는데요
바로 (getpoint "x에 사용할 점을 클릭하세요") 와 같이 사용할 수 있어요
getpoint 는 클릭한 점의 좌표를 가져오는 함수이므로
x 에는 사용자가 클릭한 점의 좌표를 (x y z) list 형식으로 저장합니다.
지역 변수와 전역 변수
변수는 크게 지역 변수 (local variable)와 전역 변수 (global variable)로 구분할 수 있어요.
이름에서도 유추할 수 있듯이
특정 제한된 영역 안에서만 쓰는 변수를 지역 변수 라고 하고
제한 없이 전체적으로 적용되는 변수를 전역 변수 라고 해요.
지역 변수를 선언할 때는 / (슬래쉬) 를 써주며 호출이 완료되면 변수 값이 사라집니다. (해당 영역에서만 사용해야 하므로)
예시 1
=> Output : 지역 변수,test1,test2
(defun globalVar( arg1 arg2 / arg3)
(setq arg3 "지역 변수")
(princ (strcat arg3 "," arg1 "," arg2))
)
(globalVar "test1" "test2")
예시 2
=> Output :
(setq *globalVar* "global")
(defun setFunc ( / localVar)
(setq localVar "local")
(princ (strcat "n지역 변수: " localVar "n전역 변수: " *globalVar*))
)
(setFunc)
지역 변수: local
전역 변수: global
리습의 경우 동일한 변수명을 사용하면 nil (공백) 값으로 할당되기 때문에 ** 는 귀마개 연산자라고 불러요
사실 * 을 붙이지 않더라도 동작은 잘 하지만 고개발 생각에는 전역 변수에는 관례적으로 ** 표시를 해주는 편인 것 같아요.
예시 3
(setq varscope "전역 변수")
(defun listscope ( / varscope)
(if (/= varscope nil)
(princ (strcat "n A: " varscope))
(princ (strcat "n A: nil"))
)
(setq varscope "지역 변수")
(princ (strcat "n B: " varscope))
)
(listscope)
드래그하여 정답 확인하기!
A: nil
B: 지역 변수
AutoLISP의 데이터 타입
다음으로 넘어가기 전에 오토리습의 데이터 타입에 대해 한번 짚고 넘어가볼까 해요.
INT (정수)
0, 1, 2, … , 100 과 같은 정수(integer)를 표현해요.
아래 내용은 참고로만 알아두시면 돼요~
2^32 (2의 32제곱)까지 표현되고, 최댓값이 연산되었을 땐 음수 값으로 순환됩니다.
(princ 2147483647)
(princ 2147483647) ;;2.14748e+009
(princ (+ 2147483646 3)) ;;-2147483647
REAL (실수)
소수점을 포함하는 실수(real number)를 표현해요
STR (문자열)
문자열을 표현하는 데이터 타입이에요.
SYM (기호)
일련의 문자, 숫자, 특수 문자를 표현하는 데이터 타입이에요.
예시
(type variable) 을 입력하면 데이터 타입을 리턴해줍니다.
(setq a 10 b 21.587 c "Hello world!" x '(a b c))
(type a) ;;INT
(type b) ;;REAL
(type c) ;;STR
(type x) ;;LIST
(type 'a) ;;SYM
데이터 변환
다음은 위에서 살펴본 데이터 타입을 다른 데이터 타입으로 변환시키는 방법에 대해 알아보도록 해요!
itoa : 정수(INT)를 문자열(STR)로 변환
atoi : 문자열(STR)을 정수(INT)로 변환
atof : 문자열(STR)를 실수(REAL)로 변환
예시
(princ (strcat "n" (setq a (itoa 25)))) ;;a : "25"
(princ (setq b (atoi "25"))) ;;b : 25
(princ (setq c (atof "25.6726"))) ;;c : 25.6726
rtos : 숫자를 문자열로 변환
기본 구조 :
(rtos Number Option Precision)
(rtos Variable Option Precision)
Options | 설명 |
---|---|
1 | Scientific (지수형) |
2 | Decimal (10진형) |
3 | Engineering (피트 10진형) |
4 | Architecture (피트 분수형) |
5 | Fractional (분수형) |
Precision | 설명 |
---|---|
0 | 일의자리까지 출력 |
1 | 소수점 이하 1번째까지 출력 |
2 | 소수점 이하 2번째까지 출력 |
3 | 소수점 이하 1번째까지 출력 |
예시
(princ (setq d (rtos 20.63434 2 1))) ;;d : 20.6
(princ (setq e (rtos 20.63434 2 2))) ;;e : 20.63
angtos : Radian 각도를 Mode에 따라 문자열로 변환
기본 구조 :
(angtos Number Mode Precision)
(angtos Variable Mode Precision)
Mode | 설명 |
---|---|
0 | Degree |
1 | Degree:Minutes:Second (도:분:초) |
2 | Grads |
3 | Radian |
4 | Surveyor's unit (측량단위) |
예시
(princ (setq f (angtos 3.1415))) ;;f : "180"
angtof : Radian 각도를 문자열로 변환하며 Mode에 따라 부동 소수점으로 변환
기본 구조 :
(angtof "Number-String" Mode)
(angtof Variable Mode)
예시
(princ (setq g (angtof "180" 0))) ;;g : 3.14159
ascii : 문자에 해당하는 아스키 코드를 반환
예시
(princ (ascii "x")) ;;x : 120
(princ (ascii "y")) ;;y : 121
(princ (ascii "z")) ;;z : 122
chr : 아스키 코드에 해당하는 문자를 반환
예시
(princ (chr 120)) ;;"x"
(princ (chr 121)) ;;"y"
(princ (chr 122)) ;;"z"
fix : 숫자의 정수 부분을 반환
예시
(princ (setq h (fix 2.001))) ;;h : 2
(princ (setq i (fix 0.9780445))) ;;i : 0
float : 정수를 실수 형식으로 반환
예시
(princ (setq j (float 26))) ;;j : 26.0
read : 문자열을 기호로 반환
예시
(setq testA 100)
(princ (eval (read "testA"))) ;;100
strcase : strcase 뒤에 오는 문자열이나 변수에 저장된 문자열을 Option에 따라 대문자 또는 소문자로 반환
예시
(princ (setq k (strcase "lisp"))) ;;k : "LISP"
distof : 문자열이나 문자열이 저장된 변수를 Option에 따라 실수로 반환
Options | 설명 |
---|---|
1 | Scientific (지수형) |
2 | Decimal (10진형) |
3 | Engineering (피트 10진형) |
4 | Architecture (피트 분수형) |
5 | Fractional (분수형) |
예시
(princ (setq l (distof "3.1415E001"))) ;;l : 31.415
오늘은 리습의 변수에 대해 설명드리고 다양한 예시를 통해 활용법을 알아보았습니다!
확실히 지난 시간들에 비해 알아야 할 내용이 좀 더 많고 복잡해졌죠?
하지만 리습도 하나의 언어이다 보니 잘 찾아보면서 규칙에만 맞게 쓰신다면 금방 익힐 수 있을 거예요
그럼 고개발의 리습 시리즈는 다음에 또 만나요! 🖐
댓글 남기기