LISP를 구성하는 기초 블록
원소(atom) : 수 or 수들과 특별한 문자들을 포함하는 인접하는 문자들의열이다
Ex) .my-name-kiminwoo , inwoo , inwoo73
리스트(list) : 원소 or 다른리스트들을 괄호 안에 묶어놓은 것이다
Ex ) (my name is inwoo) , ( I ( n w ) oo)
열(string) : 문자들을 겹따옴표안에 묶어 놓은 것이다.
Ex ) “my name in inwoo” , “ I n w o o”
LISP프로그램은 인터프리터상 에서나 컴파일된 코드 형태로 수행된다.
LISP은 접두어 표현 prefix notation을 사용한다.
기본적인 신술연산은 + , - , * , / 이 있다.
산술연산자 중 * 와 + 는 0개 또는 더 많은 인수를 가지는 반면에,
- 와 / 는 2개의 인수를 가진다.
LISP 는 함소의 인수를 포함하여 모든 것을 평가하려 한다.
하지만 ( 원소, 리스트, 열)는 항상 그것 자체로 평가되고 그 자신의 값(숫자들, 논리적 참을 나타내는 t, 논리적 거짓을 나타내는 nil)을 되돌려 받는다는 점에서 특별하다.
리스트 조작함수
setq ; 값이 할당 or 주어질수 있게 해줌
Ex ) ( setq x 10 ) <-- 이때 setq를 써서 x에 10을 할당하는 것이다.
car: 리스트인 하나의 인수를 취하며 , 리스트의 첫 번째 요소를 되돌려 주는 함수이다.
Ex ) ( car ‘(a b c)) --> a를 리턴한다 ,
cdr: 인수로 하나의 리스트를 갖는 함수이며 , 첫 번째 요소를 제외한 나머지 요소들로 이루어진 리스트를 되돌려 준다.
Ex) (cdr ‘(a b c)) --> (b c)를 리턴한다 .
cons: 원소와 리스트를 취한다 , 그 원소를 리스트의 첫 번째 요소로 포함시킨 새로운 리스트를 만들어 준다.
Ex) (cons ‘a’(b c)) --> (a b c)를 리턴한다. 원소 a를 리스트 (b c) 에 맨 앞부분에 대입을 시키는 것이다.
list: 임의의 형태의 다수의 인수를 가지며 , 각 인수를 결합한 또 하나의 리스트를 만든다.
Ex ) (list ‘a ’(b c)) --> ( a (b c))를 리턴한다. 원소 a를 리스트 (b c)와 결합을 하는데 , a를 (b c) 리스트와 결합하면서 리스트의 구조를 유지하면서 a를 또 하나의 리스트로 취해서 리스트로 결합한다.
append: 둘 또는 그 이상의 리스트를 하나의 리스트로 통합한다 .
Ex) (append ‘(a) ’(b c)) --> ( a b c )를 리턴한다 , 쉽게 말해서 리스트 끼리 결합을 하여 하나의 리스트로 만드는 것이다.
last:마지막 원소를 포함한 리스트를 되돌려 준다
Ex)(last ‘(a b c)) --> (c)를 리턴한다 . 마지막 원소를 포함한 리스트를 되돌려 주는 것
member: 첫 번째 인수와 일치하는 요소부터 시작하는 두 번째 인수 리스트를 되돌려 준다.
Ex) (member ‘b ’(a b c)) --> (b c)를 리턴한다 . b와 일치하는 요소부터 시작하기 때문에 (b c)를 리턴한 것이다.
reverse: 요소들을 역순으로 나열한 리스트를 되돌려 준다.
Ex) ( reverse (a (b c) d)) --> ( d (b c) a )를 리턴한다
사용자 정의 함수(User-defined Function)
--> 이것은 java로 비유하자면 functions을 만드는 것인데 , LISP에서는 defun으로 나타낼 수 있다.
형태는 다음과 같다 .
(defun name(arg1, arg2 ...) body )
예를 들어 보자
(defun sum( n1 n2 )
( + n1 n2 ))
를 하게 되면 sum이라는 단어가 뜰 것이고 , 그러면 sum이라는 함수가 만들어진 것이다 .
사용할 때는 sum(1 2) 식으로 사용할 수 있게 된다 .
술어 함수(Predicate Functions)
atom: 하나의 인수를 취한다 , 만약 그 인수가 원소일 경우 t를 결과 값으로 돌려주고 그렇지 않을 경우는 nil을 돌려준다 .
Ex) (setq x 10)
(atom x) --> t를 리턴한다 , x는 10이 저장되어 있고 , 원소는 문자열과 숫자로 이어진 것을 의미 하기 때문이다.
equal: 2개의 인수를 취하며 만약 그 둘이 같은 값으로 평가되면 t를 돌려주고 , 그렇지 않으면 nil을 돌려준다.
Ex) (equal ‘a ( car ’(a b))) --> t를 리턴한다 . car를 통해서 a를 리턴하고 equal을 통해서 두 원소를 비교하게 되는데 비교하는 값이 똑같기 때문에 t를 리턴하는 것이다
evenp: 짝수 여부를 t , nill로써 평가하며 , p가 붙는 이유는 predicate이기 때문이다.
Ex) ( evenp 10 ) --> t를 리턴한다 . 왜냐하면 10은 짝수 이기 때문이다.
numberp: 숫자 여부를 t or nil로써 평가한다 .
Ex) ( numberp 10inwoo ) --> nil을 리턴한다 . 왜냐하면 10자체는 숫자가 맞지만 inwoo가 붙음으로써 숫자가 아니기 때문이다 .
oddp: 홀수 여부를 t , nil 로써 평가한다.
Ex) ( oddp 3 ) --> t를 리턴한다 , 왜냐하면 3자체는 홀수 이기 때문이다 .
zerop: 제로 여부를 t , nil로써 평가한다 .
Ex) (zerop 0.00001) --> nil을 리턴한다 , 왜냐하면 인수가 0이 아니기 때문이다.
listp: 인수가 list로 평가될 때 t , 아니면 nil을 리턴한다
Ex) (listp ‘(a)) --> t를 리턴한다 , 왜냐하면 (a)는 리스트이기 때문이다.
null: 인수가 nil로 평가되면 t , 아니면 nil을 리턴한다
Ex ) ( null nil) --> t를 리턴한다 nil은 빈 리스트 이기 때문이다 .
조건문(Conditional Cond)
조건문은 java에서 if – else 문과 비슷하다 . 하지만 다른 형태를 지닌다 .
형태는 다음과 같다 .
(cond (<test1> <action1>)
(<test2> <action2>))
이런 식으로 생겼으며 , test1가 true라면 action1이 수행 되는 것이다 .
그리고 마지막에 (t action3)) 이 붙게 되는데 , 이 t는 조건절이 평가 되지 않을 경우 이 부분은 반드시 평가되어 지도록 하는 역할을 한다 .
Ex )
(setq x 5)
(setq y 6)
(cond (( < x y )y)
(t x)))
의 결과를 보면 y가 출력 되는 것을 알 수 있다 .
논리 함수(Logical Functions)
not: 하나의 인수를 취하며 , 만약 그 인수가 nil로 평가되면 t로 리턴하고 , 만약 그 인수가 t로 평가되면 nil로 리턴한다 .
Ex) (setq x’(a b c))
(not (atom x)) --> t를 리턴한다 . x는 리스트이기 때문이다.
and: 만약 모둔 인수가 non-nil로 평가되면 마지막 인수의 값이 되돌려진다. 그렇지 않을 경우는 nil이 되돌려 진다 .
or: 인수들 중 어느 하나가 non-nil이 될 때까지 평가를 계속하다가 non-nil이 있을 경우 그 non-nil의 값을 되돌려 주고 , 그렇지 않을 경우 nil을 되돌려 준다 .
입력, 출력, 지역변수
read 함수: 어떠한 인수도 취하지 않는다 , read가 프로그램상에 나타나면 하나의 상징표현 혹은 상징문이 키보드로부터 입력될 때까지 수행이 잠시 중단된다 . 상징문은 read함수의 결과값으로서 되돌려지고 화면에 나타나고 수행은 계속된다 .
Ex) (+ 5 (read))
read는 사용자의 입력을 기다리고 , 입력을 통한 값에 +5를 한값을 리턴시킨다 .
print 함수: 하나의 인수를 취한다 , 그것은 인수를 받아들인 그대로 프린트하고 동시에 그 인수를 되돌려 준다 . 이것은 어떤 것을 프린트 함과 동시에 그것을 다른 함수에 인수로 제공하는 방식으로 수행된다 , 겹따옴표 까지 인쇄한다는 것을 알 수 있다.
princ 함수: 출력에서 겹따옴표가 표시되는 것을 피할 수 있게 해준다 . 이 기능을 제외하고는 prinl과 똑같다 .
Ex) (princ “hello there”) --> hello there “hello there” 의 결과를 리턴한다 .
하지만 이것을 보면 echo 즉 , 또한번 문장이 나오는 것은 남아 있다 .
terpri 함수: 인수는 취하지 않고 , 그것이 나타나는 곳에는 항상 새로운 라인이 생기며 nil값을 되돌려 준다 .
format 함수: 일반 형태는 다음과 같다 (format <destination> < string> arg1 arg2...의 형태를 띈다 . <destination> 은 출력되는 곳 , 모니터인지 , 외부 파일인지를 표시하는 것이고 , t는 디폴트 출력으로서 모니터를 뜻한다 . 포맷지시어들은 문자열내에서 인수들이 출력되는 순서와 동일한 순서로 나타난다 . 각 지시어들은 그것이 지시어임을 표시하는 기호로 틸드 문자를 항상 각 지시어 앞에 붙여준다 .
“A , ”S , “D , ”F , “C , ”^
* 다음의 문제에 대하여 LISP 프로그램을 작성하시오.
1. 인수로서 리스트를 취하고, 리스트의 첫 번째 요소를 되돌려 주는 first-element라는 함수를 정의하시오.
>(first-element '(1 2 3 4))
1
Solution : (defun a(a b c d) (car (list a b c d)))
2. 인수로서 하나의 리스트를 취하고, 리스트내의 요소의 갯수를 되돌려주는 my-length 라는 함수를 정의하시오. (recursive structure를 사용하면 좋습니다.)
>(my-length '(1 2 3 4 5 6))
6
Solution :(defun b(a b c d e f) (length (list a b c d e f )))
'학부공부 > 인공지능' 카테고리의 다른 글
LISP의 반복과 순환 ( Iteration and Recursion ) (0) | 2018.10.09 |
---|---|
LISP 의 지역 변수 구조 ( Constructs for Local variables ) (0) | 2018.10.09 |
LISP 간단 정리 (0) | 2018.10.05 |
LISP 에서의 입력과 출력 (0) | 2018.10.03 |
LISP에서의 사용자 정의 함수 , 술어 함수 , 조건문 , 논리함수 (0) | 2018.10.03 |
#IT #먹방 #전자기기 #일상
#개발 #일상