상세 컨텐츠

본문 제목

2. LISP의 기초 및 필수 기본 함수 설명과 예제 1부

IT & Programming/LISP 공부

by 그림아이 2022. 1. 24. 08:00

본문

반응형

1. 프로그래밍 기본 원칙

 

 모든 LISP 파일들의 기본 확장자는 LSP 이다. ( : CHTEXT.LSP)

 개발을 위한 도구로는 메모장 또는 AutoCAD 내의 자체 LISP editor 사용합니다. 자체 editor loading 명령어는 VLIDE (Visual Lisp Integrated Development Environment) 이다.

 기본 언어는 영어로 구성된다.

 

2. 변수

 

변수는 자료를 저장하는 비어있는 상자와 같다. 변수의 글자는 반드시 영문자이어야 하며 다음 글자부터는 숫자와 영문자의 조합으로 가능하다. ( : A, ARC1, POINT1, PNT1, D3)

변수는 사용자가 임의로 지정하는 것이다. , 변수의 이름이 내장된 함수와 같으면 error 나므로 안된다.

LISP 변수는 다음의 값을 가질 있다.

 

Real number (실수)

String (문자열)

Integer (정수)

Pickset (선택된 객체 또는 객체의 조합)

 

변수는 단지 값을 저장하는 역할만을 한다.

 

3. SEMICOLON (;)

 

SEMICOLON 뒤에 쓰여지는 문장을 주석문이라 하며 개발자 또는 사용자가 혼동하기 쉬운 부분이나 설명이 필요한 부분에 사용될 있다.

 

(prompt "This line will print") ;This is a comment

 

 

 

 

4. PARENTHESES ( )

 

괄호는 LISP 프로그램에 있어서 가장 기본적이고, 가장 중요한 요소이다. 모든 프로그램 내의 명령은 괄호로 둘러싸인다. LISP 프로그래밍 상에서 가장 흔하게 일어나는 실수 하나가 바로 괄호의 개수가 모자라거나 남는 것이다. 괄호의 개수는 짝수이어야 하며 열린 괄호의 개수와 닫혀진 괄호의 개수는 항상 같아야 한다.

 

 

5. THE DEFUN COMMAND

 

항상 프로그램의 앞에 나오는 DEFUN 프로그램의 이름 또는 함수를 정의하고 선언하기 위한 가장 기초적인 명령이다. DEFUN 뒤에 나오는 사용자 정의 함수 이름 또는 프로그램 이름은 기존 AutoCAD 내장된 명령어와 같으면 충돌하여 error 발생한다.

사용 예는 다음과 같다.

 

(Defun drawline ()

(Defun drawline (/ pntl pnt2)

(Defun C:drawline ()

(Defun C:drawline (/ pntl pnt2)

(Defun drawline (a / pntl pnt2)

 

번째 방법은 프로그램에서 이용하려고 하는 모든 변수가 전역변수임을 선언한다. 전역변수는 AutoCAD 종료되기 전까지는 LISP 종료되더라도 값을 잃지 않는다. 이때 defun 뒤에 오는 명령어는 LISP 내에서만 사용되고 AutoCAD 내에서 명령어로는 사용할 없다.

 

번째 방법은 괄호 안에 등록된 변수가 지역변수임을 선언하는 것이다. 지역변수는 LISP 프로그램 종료와 동시에 값을 잃어버린다.

 

번째 방법은 번째 방법과 같이 전역변수임을 선언하지만 C: 뒤에 오는 명령어를 AutoCAD 내에서 다른 명령어들과 동일하게 사용할 있도록 정의하는 방법이다.

 

번째 방법은 번째 방법과 같지만 변수가 지역변수임을 선언한다.

 

마지막의 방법은 프로그램 외부로부터 a 라는 변수에 값을 입력 받아 사용되는 방법이다. 앞의 4가지 방법과 비교해 고급 기법이다.

 

 

6. DATA TYPES

 

Integers (정수) : -32768 +32767 사이의 정수만을 말한다. ( : 1)

Reals (실수) : 소수점을 가진 모든 수를 말한다. ( : 1.0)

Strings (문자열) : 최대 100 글자까지의 문자열을 말한다. ( : text)

Lists (리스트) : 괄호 단에 하나 이상의 원소를 가진다. 특히 AutoCAD 좌표는 (X Y Z) 같이 리스트의 형식을 취한다. ( : (1 2 3 4 5))

Atoms (아톰) : 변수가 오로지 개의 값만을 가지면 그것을 atom이라 부른다. ( : 1)

 

 

7. LISP 기초

 

이제 당신은 LISP 프로그래머가 되었다. 그런데 아직 별로 실감이 나지 않을 것이다. 아마 어리둥절할지도 모른다. 아무것도 생각하지 말고 AutoCAD command 창에 아래와 같이 타이핑해 보자.

 

(alert "Hello world")

 

그리고 enter 치면 화면 상에 다음과 같은 창이 load 된다.

 

Hello world

당신은 방금 LISP 프로그램을 하나 개발한 것이다. 모든 프로그램 언어의 시작은 바로 위와 같이 “Hello world” 시작한다는 사실을 명심하자.

 

다른 것을 시도해 보자. 아래의 구문을 command 창에 입력한 enter 키를 누른다.

 

(setq a (getpoint))

 

마우스로 화면 위의 임의의 점을 선택한다. Error 없이 종료되었다면 command 창에 다음과 같은 리스트가 보일 것이다.

 

(227.661 120.488 0.0)

 

리스트는 좌표 값을 말한다. getpoint 함수는 사용자로부터 좌표 값을 입력 받는 함수라는 것을 있다. 좌표 값은 (X Y Z) 순서로 기억되며, 위의 예는 X=227.661, Y=120.488, Z=0.0 좌표를 리스트로 표현한 값이다.

Setq set equal 약자로변수 a 사용자로부터 입력 받은 좌표를 저장한다.”라는 뜻으로 해석할 있다. 변수 a 저장된 값을 확인하고 싶을 때는 아래와 같이 command 창에 입력하면 된다.

 

!a

 

괄호의 개수를 맞추는 작업은 가장 기본적이면서도 가장 놓치기 쉬운 부분이다. 괄호의 개수를 맞추는 가장 좋은 방법을 소개하겠다.

아래와 같은 구문이 있다고 하자.

 

(dosomething (dosomethingelse (andanotherthing)))

 

위와 같이 구성된 구문이 1000 이상 이어질 때는 괄호의 개수 맞추기가 여간 어려운 것이 아니다. 이럴 때는 아래와 같이 하면 실수도 줄일 있고 금방 눈에 있다.

 

(dosomething (dosomethingelse (andanotherthing)

)

)

 

또는 semicolon (;) 사용하여 주석문으로 구분하는 것도 좋다.

 

(dosomething (dosomethingelse (andanotherthing) ; end of first something

) ; end of second something

) ; end of third something

 

위의 getpoint 함수 사용시 사용자에게 입력을 요구하면서 전달하고 싶은 메시지가 있을 때는 다음과 같이 사용한다.

 

(setq a ( getpoint "\nChoose a Point : "))

 

위와 같이하면 command 창에 추가된 메시지가 보일 것이다. 따라서 사용자는 메시지만을 보고 마우스로 좌표 값을 입력하게 된다. 사용시 반드시 슬래쉬 (\) 소문자 n 함께 써야만 아래로 내려가 새로운 줄에 메시지가 보여지게 된다. \n 사용할 때와 사용하지 않았을 때를 비교해 보면 금방 있다.

 

아직은 text editor vlisp editor 사용하지 않고 command 창에서 연습해 보는 단계이지만 결국 editor들의 역할이 바로 command 창에서 있는 기능을 보다 확장시킨 것뿐인 것이다.

다음은 프로그램을 만들어 보자. 아래와 같이 타이핑해 보자.

 

(setq a (getpoint "\nEnter First Point : ")) → enter 키를 누르고 마우스로 임의의 점을 입력한다.

 

(setq b (getpoint "\nEnter Second Point : ")) → enter 키를 누르고 마우스로 다른 점을 입력한다.

 

(command "Line" a b "") → enter 키를 누른다.

 

이제 프로그램 운용 원리에 대해 대충 알았을 것이다. 변수 a 저장된 좌표와 변수 b 저장된 좌표 사이에 line 생성시키는 방법을 보여준 것이다. 마지막의 command 함수도 여겨 보아야 한다. 뒤에 나오는 AutoCAD 명령어들은 반드시 colon (“)으로 묶여져 있어야 하며 명령 수행 과정은 키보드로 수행하는 과정과 동일하다. 마지막의 비어있는 “” 무엇일까? Line 명령을 종료할 키보드로 enter키나 spacebar 자신도 모르게 눌렀던 것을 기억하는가? 바로 작은 부분 까지도 LISP 저렇게 입력해야 하는 것이다.

 

이제 프로그램을 외부 문서로 저장하여 AutoCAD 불러들이는 것을 해보자. 앞에서도 잠시 언급했지만 가지 방법으로 나누어 설명할 예정이다.

 

첫째, 외부로부터 불러들이는 방법.

AutoCAD command 상태에서 vlide 입력한다. 그러면 editor 창이 load 것이다.

파일을 열어 아래 프로그램을 그대로 복사해서 붙여 넣는다.

 

(defun C:testline ()
  ; define the function
  (setq a (getpoint "\nEnter First Point : ")) ; get the first point
  (setq b (getpoint "\nEnter Second Point : ")) ; get the second point
  (command "Line" a b "") ; draw the line
) ; end defun

그런 다음 임의의 폴더에 testline.lsp 저장한다. 이제 다시 AutoCAD 돌아가 appload 명령어로 방금 저장한 파일을 load한다. Command 창에 위에서 정의한 testline 명령어를 직접 입력한다. 그러면 위에서 \n 뒤에 입력한 설명문이 보여질 것이다. 이제 마우스로 점을 입력하면 자동적으로 line 생성되는 것을 확인할 있다.

 

번째 방법은, 자체 editor에서 직접 불러들이는 방법.

Editor 창으로 돌아가면 아래 그림과 같이 방금 저장했던 파일을 있다.

 

LISP Editor (에디터, 편집기)

지금 상태에서 ctrl + alt + C 누르면 아래의 그림과 같이 된다. 명령어는 LISP 오류를 CHECK하는 기능이다. 만약 위에서 마지막 괄호를 지우고 명령을 다시 실행하면 다음 그림과 같이 error 메시지가 보일 것이다.

이제 다시 LISP 창으로 돌아가 ctrl + alt + E 누르면 번째 그림과 같이 되면서 자동적으로 load 된다. 그리고 AutoCAD 돌아가 위의 번째 방법과 동일하게 실행하면 된다.

 

에디터-1
에디터-2
에디터-3

이제 여러분은 LISP load하는 법을 배웠다. 이제 슬슬 호기심을 동원해 위의 프로그램을 조금 손을 보면 어떻게 될까? 위의 방법대로 실행하면 여러분은 command 창에서 아래와 같은 그림을 있었을 것이다.

 

Command Line-1

그런데 마지막 줄에 nil 프로그램이 마무리가 되었다. nil이란 것이 무엇인지 아직 모르지만 없애기 위해서는 가장 마지막 줄에 (princ) 구문을 삽입하고 다시 ctrl + alt + E load하면 다음과 같이 nil 사라지는 것을 확인할 있다.

 

(defun C:testline ()
  ; define the function
  (setq a (getpoint "\nEnter First Point : ")) ; get the first point
  (setq b (getpoint "\nEnter Second Point : ")) ; get the second point
  (command "Line" a b "") ; draw the line
  (princ)
) ; end defun

Command Line-2

결국 (princ) 의 역할은 프로그램 종료 후 불필요한 메시지들을 정리해주는 역할을 한다. 본 강좌는 여느 책들의 순서와 비슷하게 흘러가고 있지만, 내용은 많이 다르며 또한 다르도록 끊임없이 노력할 것이다. 
이쯤에서 강조하고 싶은 것은 앞으로 여러분들은 수많은 함수들과 구문들을 많이 접할 것인데, 다시 나중에 언급하겠지만 당분간 초보 과정에서는 구문 자체를 외워두는 것이 실력 향상에 가장 빠른 방법 중 하나이다. 그렇다고 학창시절에 수학 공식 외우듯 달달 외울 필요는 없고, 하나의 구문을 공부해서 저장해놓은 다음 필요할 때마다 복사해서 쓰는 것이 좋다. 
예를 들어 위의 princ 함수에 대해 지금 자세히 설명할 수도 있겠지만 저자의 경험상으로는 처음부터 어려운 설명을 많이 늘어놓아봤자 머리에도 잘 안 들어온다. 따라서 위의 (princ)는 습관처럼 프로그램 마지막 줄에 그냥 넣어두는 것으로 알고 있어도 아무 지장이 없다는 뜻이다.

외워두고 저장해두고 눈에 익혀두면 좋은 구문들을 또 한가지 소개해 보겠다.
재미있는 예제로 태극 문양을 그려보자. 아직 초보인 여러분들은 갑자기 프로그램을 만든다는 것이 쉬운 일이 아니지만 일단 어떻게 만드는지 눈에 익혀두면 두고두고 도움이 될 것이다.
원래 태극 문양은 쉽게 그릴 수 있는 모양이 아니다. 그러나 여기서는 그저 모양만을 흉내 내어 LISP의 기초를 닦고자 한다.

프로그램을 만들기 전에 가장 먼저 해야 할 일은 아이디어를 짜는 것이다. 일단 우리는 여기서 태극 문양을 그리기로 결정했으므로 첫 번째 단계는 넘어가기로 한다.


두 번째 단계는 sketch (스케치)이다. 어쩌면 이 단계가 가장 중요한 단계이다. 왜냐하면, 스케치가 제대로 되지 않으면 나중에 프로그램을 짤 때 반드시 난관에 부딪히거나 문제가 발생하게 되어 있기 때문이다.

일단 이번 프로젝트의 Sketch 아래 그림과 같은 과정으로 보았다.

 

태극문양 스케치

다음 시간에 계속됩니다.

 

 

 

 

 

 

 

 

 

728x90
반응형

관련글 더보기

댓글 영역