상세 컨텐츠

본문 제목

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

IT & Programming/LISP 공부

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

본문

반응형

이전 시간에 이어 LISP의 기초 및 필수 기본 함수 설명과 예제를 진행합니다.

 

(if <testexpr><thenexpr>[<elseexpr>])

 

가정문이 참이면 첫 번째 실행문을, 거짓이면 두 번째 실행문을 실행한다.

예 : Command: (if (= 1 3) "YES!!" "no.") 
"no." 
Command: (if (= 2 (+ 1 1)) "YES!!") 
"YES!!" 
Command: (if (= 2 (+ 3 4)) "YES!!") 
nil 

위의 구문에서 실행문의 내용이 길어질 경우 progn 함수와 함께 사용한다.

(if (= 1 3)
  (progn
    (prompt “\n"YES!!")
    (command “line” ‘(0 0) ‘(100 0) “”)
  ) ; end of progn
  (progn
    (prompt "\nno.")
    (command “line” ‘(0 0) ‘(100 100) “”)
  ) ; end of progn
) ; end of if

 

 

(inters <pt1><pt2><pt3><pt4>[<onseg>])

좌표 4개의 교차점을 return한다. pt1, pt2는 한 line의 양 끝점이고 pt3와 pt4는 또 다른 line의 끝점이다. 직접 교차하는 line 2개를 긋고 4개의 point로 연습해보면 알 수 있다. 이때, 교차하지 않으면 nil을 return하는데 마지막에 nil이란 option을 넣어주면 교차하지 않아도 무한 연장시켜 교차점을 return하게 된다. 아래의 예에 나온 좌표대로 line을 그어보면 교차하지 않는 것을 알 수 있는데 nil option으로 교차점을 구하는 모습을 볼 수 있다. 직접 line을 그려서 결과값과 비교해 보는 것이 좋다.

예 : (setq a '(1.0 1.0) b '(9.0 9.0)) 
(setq c '(4.0 1.0) d '(4.0 2.0))
Command: (inters a b c d) 
nil 
Command: (inters a b c d T) 
nil 
Command: (inters a b c d nil) 
(4.0 4.0) 

(itoa <number>)

정수를 문자열로 변환한다.
예 : Command: (itoa 33) 
"33" 
Command: (itoa -17) 
"-17" 

(lambda <arguments><expr>...)

고급 함수로 apply와 mapcar 함수와 함께 쓰인다. 이름이 정의되지 않은 함수를 정의한다. 즉, defun으로 함수의 이름을 정의하지 않고 임시로 쓰이는 함수를 정의할 때 사용된다. 이 함수의 사용법을 익혀두면 고급 프로그램을 개발하는데 여러모로 사용할 수 있다.

(apply '(lambda (x y z) 
          (* x (- y z)) 
        ) 
        '(5 20 14) 
)
→ 30 ; 왜 이런 값이 나오는지 잘 생각해 보아야 한다. 5 X (20 -14) = 30의 식을 나타낸 것이다.
(setq counter 0)
(mapcar '(lambda (x) 
           (setq counter (1+ counter)) 
           (* x 5) 
         )
         '(2 4 -6 10.2) 
)
→ (10 20 -30 51.0) ; mapcar 함수의 특징으로 list의 각 원소들에 일률적으로 함수를 적용한다.

(last <list>)

list의 마지막 원소를 return한다.

예 : Command: (last '(a b c d e)) 

 

E 
Command: (last '(a b c (d e))) 

 

(D E) 

(length <list>)

list의 원소 개수를 retun한다.

예 : Command: (length '(a b c d)) 
4 
Command: (length '(a b (c d))) 
3 
Command: (length '()) 
0

(list <expr>)

나열된 변수 또는 표현식들을 하나의 list로 묶는다. 이때 list 함수는 ‘와 동일한 기능을 한다.

예 : (list “a” “b” “c”) = ‘(“a” “b” “c”)
→ (“a” “b” “c”)
(setq a 0) (setq b 1) (setq c 2)
(list a b c) = ‘(a b c)
→ (0 1 2) 
(list 3.9 6.7) = ‘(3.9 6.7)
→ (3.9 6.7)

(listp <list>)

함수 뒤에 나오는 표현식이 list이면 T, 아니면 nil을 return한다.

예 : Command: (listp '(a b c)) 
T 
Command: (listp 'a) 
nil 
Command: (listp 4.343) 
nil 
Command: (listp nil) 
T 
Command: (listp (setq v1 '(1 2 43))) 
T 

(load <filename>)

LISP내의 함수를 load하는 함수로 특정한 경로를 지정하지 않으면 support file path에 등록된 경로에서 찾게 된다. 예를 들어 AutoCAD2004 폴더의 support방에 임의의 LISP 파일을 복사해두고, 직접 load하는 연습을 해보면 된다. 이때, 경로구분 표시는 슬래쉬(/), 또는 백 슬래쉬 두 개 (\\)로 구분 한다. (c:/work/test1.lsp 또는 c:\\work\\test1.lsp) 파일의 확장자는 lsp, vlx, fas등을 지원한다. 그리고 등록된 경로인 경우에는 따로 경로를 지정하지 않고 파일 이름만 입력해도 된다.

예 : Command: (load "/fred/test1") 
MY-FUNC2 
Command: (load "\\fred\\test1") 
MY-FUNC2 
→ 이 예제는 샘플이므로 각자 가지고 있는 lisp으로 연습해보길 바란다.

 

 

(mapcar <function><list1>...<listn>)

위에서 lambda 함수에서 잠깐 언급했듯이 뒤에 오는 list에 일률적으로 함수를 적용하는 함수이다.

예 : Command: (setq a 10 b 20 c 30) 
30 
Command: (mapcar '1+ (list a b c)) 
(11 21 31) 

(max <number><number>...)

여러 숫자들 사이에서 최대값을 return한다.

예 : Command: (max 4.07 -144) 
4.07 
Command: (max -88 19 5 2) 
19 
Command: (max 2.1 4 8) 
8.0 

(member <expr><list>)

표현식이 list의 원소라면 그 표현식을 가장 앞으로 하고 뒤로만 return한다.

예 : Command: (member 'c '(a b c d e)) 
(C D E) 
Command: (member 'q '(a b c d e)) 
nil 

(min <NUMBER><NUMBER>...)

여러 숫자들 사이에서 최소값을 return한다.

예 : Command: (min 683 -10.0) 
-10.0 
Command: (min 73 2 48 5) 
2 
Command: (min 73.0 2 48 5) 
2.0 
Command: (min 2 4 6.7) 
2.0 

(minusp <ITEM>)

주어진 값이 음수인지를 판단하여 음수이면 T, 아니면 nil을 return한다.

예 : Command: (minusp -1) 
T 
Command: (minusp -4.293) 
T 
Command: (minusp 830.2) 
nil 

(not <ITEM>)

주어진 item이 nil이면 T을 retun한다.

예 : Command: (setq a 123 b "string" c nil) 
nil 
Command: (not a) 
nil 
Command: (not b) 
nil 
Command: (not c) 
T 
Command: (not '()) 
T 

(nth <n><LIST>)

List의 n번째 원소를 return한다. 이때 주의할 점은 n은 0부터 시작한다는 것이다.

예 : Command: (nth 3 '(a b c d e)) 
D 
Command: (nth 0 '(a b c d e)) = (car ‘(a b c d e))
A 
Command: (nth 5 '(a b c d e)) 
nil 

(null <ITEM>)

표현식이 nil이면 T을 return한다.

예 : Command: (setq a 123 b "string" c nil) 
nil 
Command: (null a) 
nil 
Command: (null b) 
nil 
Command: (null c) 
T 
Command: (null '()) 
T 

(numberp <ITEM>)

표현식이 숫자면 T을 retun한다.

예 : Command: (setq a 123 b 'a) 
A 
Command: (numberp 4) 
T 
Command: (numberp 3.8348) 
T 
Command: (numberp "Howdy") 
nil 
Command: (numberp a) 
T 
Command: (numberp b) 
nil 
Command: (numberp (eval b)) 
T 
 

(open <FILENAME><MODE>)

Text 파일을 mode option에 따라 입력 받는다. Mode의 종류에는 “r”, “w”, “a”가 있고 각각 읽기전용, 쓰기전용, 읽기 쓰기 전용으로 구분된다. open함수는 read-line, write-line, close 함수들과 항상 함께 쓰인다. 이때 찾는 파일이 존재하지 않으면 새롭게 생성한다.

예 : Command: (setq a (open "c:/program files/AutoCAD 2004/help/filelist.txt" "r")) 
→ #<file "c:/program files/AutoCAD 2004/help/filelist.txt"> 
Command: (setq f (open "c:\\my documents\\new.tst" "w")) 
→ #<file "c:\\my documents\\new.tst"> 
Command: (setq f (open "nosuch.fil" "r")) 
→ nil 
Command: (setq f (open "logfile" "a")) 
→ #<file "logfile"> 

(or <EXPR>...)

and함수와는 달리 단 한가지라도 T이면 T을, 그리고 모두 nil이어야만 nil을 return한다.

예 : Command: (or nil 45 '( )) 
T 
Command: (or nil '( )) 
nil 

(polor <PT><ANGLE><DISTANCE>)

한 점의 좌표와 각도와 거리 값으로 얻고자 하는 점의 좌표를 return한다. 이때 반드시 각도는 라디안 값이어야 한다. 본 강좌의 LISP의 기초 참조.

예 : Command: (polar '(0 0 0) 0.0 10.0) 
(10.0 0.0 0.0) 

(prin1 <EXPR>[<FILENAME>])

표현식을 화면에 출력한다.

예 : Command: (setq a 123 b '(a)) 
(A) 
Command: (prin1 'a) 
AA 
Command: (prin1 a) 
123123 
Command: (prin1 b) 
(A)(A) 

(princ <EXPR>[<FILENAME>])

Prin1함수와 같은 함수라고 생각해도 무방하다. 차이점은 무시해도 좋다.

 

(print <EXPR>[<FILENAME>])

Prin1함수와 같은 함수라고 생각해도 무방하다. 차이점은 무시해도 좋다.

 

(progn <EXPR>...)

If 구문에서 실행문이 길어질 사용된다. 예는 if 함수의 예를 참조할 .

 

(prompt <MSG>)

메시지를 출력한다.

 예 : Command: (prompt "New value: ")
New value: nil

(read <STRING>)

문자열로부터 첫 번째 요소를 return한다. 이때 첫 번째를 판단하는 기준은 괄호, 빈칸, tap등이다. 반드시 “”로 이루어진 문자열만을 취한다.

예 : Command: (read "hello") 
HELLO 
Command: (read "hello there") 
HELLO 
Command: (read "\"Hi Y'all\"") → 문자열 내에서 “”표시를 사용하고 싶을 때는 \와 함께 
\”와 같이 사용하면 된다.
"Hi Y'all" 
Command: (read "(a b c)") 
(A B C) 
Command: (read "(a b c) (d)") 
(A B C) 
Command: (read "1.2300") 
1.23 
Command: (read "87") 
87 
Command: (read "87 3.2") 
87 

(read-line [<FILENAME>])

open함수와 항상 같이 쓰이며 text 파일을 한 줄 읽어 return한다. 직접 사용해보기 위해 c: 루트에 test.txt라는 파일을 만들고 그 파일 안에 Hello world라고 입력한 뒤 저장한다. 그리고 아래와 같이 하면 그 결과를 알 수 있다. 만일 내용이 아무것도 없다면 nil을 return한다.

예 : Command: (setq f (open "c:\\test.txt " "r")) 
#<file "c:\\test.txt">
Command: (read-line f) 
"Hello world"

(rem <NUM1> <NUM2> ...)

처음 숫자를 두 번째 숫자로 나눠서 그 나머지를 return한다. 보통 홀수인지 짝수인지를 판단하기 위해 사용하기도 한다.

예 : Command: (rem 42 12) 
6 
Command: (rem 12.0 16) 
12.0 
Command: (rem 35 2) 
1 → 홀수
Command: (rem 44 2) 
0 → 짝수

(repeat <NUMBER> <EXPR> ...)

가장 중요한 함수 중 하나로 반복 횟수만큼 표현식을 반복한다. 다음이 변수 a와 b가 마지막에 결과 값이 얼마가 될지 예측해 보길 바란다.

예 : Command: (setq a 10 b 100) 
100 
Command: (repeat 4
(setq a (+ a 10))
(setq b (+ b 100))
)
500 

(reverse <LIST>)

List의 순서를 뒤집어서 return한다.

예 : Command: (reverse '((a) b c)) 

(C B (A))

 

다음 편에서 이어집니다.

 

 

 

 

728x90
반응형

관련글 더보기

댓글 영역