LISP를 구성하는 기초 블록은 원소 (atom) , 리스트 ( list ) , 열 (String) 이다 .
원소는 수 or 수들과 특별한 문자들을 포함하는 인접하는 문자들의 열이다.
리스트는 원소 or 다른 리스트들을 괄호 안에 묶어 놓은 것이다.
열은 문자들을 겹따옴표안에 묶어 놓은 것이다.
리스트의 기본 단위 요소들을 상위요소라 부른다.
상위요소라 함은 확 와닿지가 않는다.
예를 들어보자
리스트 { a b ( c d ) e (f) } 가 있다고 할 때 상위 요소들은 a , b , (c d) , e , (f) 이다.
c , d 는 ( c d ) 의 상위요소 이다.
1. LISP 프로그램은 인터프리터 상에서나 컴파일된 코드형태로 수행이 된다.
인터프리터는 - > 부호와 같은 프롬프트를 화면에 나타냄으로써 새로운 입력을 받을 준비가 되어 있음을 나타낸다.
LISP를 사용해 본 사람들은 알 것이다 . 커맨드 창에 ->가 항상 왼쪽 옆에 있는 것을 확인할 수 있다 . 이것이 인터프리터 라고 불리는 것이다 .
2. LISP는 접두어 표현을 사용한다 프로그래밍에서 접두어표현을 쓴다는 것은 산술연산 식이 앞에 위치한다는 의미이다.
Java를 예로 들어서 설명해 보겠다.
Int a = 5
Int b = 7
Int c = 8
System.out.print(a+b+c);
이렇게 하게 되면 java에서 컴파일을 통해 20이라는 결과값을 출력한다.
LISP에서는 접두어 표현을 쓰기 때문에 다음과 같이 나타낸다
( + a b c ) à 20
이렇게 표현이 된다.
기본적 산술연산은 + , - , * / 이다 . 인수는 정수일 수도 있고 실수일 수도 있다 .
물론 함수가 가지는 인수의 수는 다를 것이다 . 보통 + , * 는 0개 또는 더 많은 인수를 가지는 반면에 -와 /는 2개의 인수를 가진다 .
LISP에서는 기본적인 함수들이 미리 정의되어 있다.
만약 ( + 3 5 8 4 ) 를 호출할 경우 리턴 값으로는 20이 나올 것이다.
여기서 우리가 알 수 있는 사실은 +는 0개 또는 더 많은 인수를 가진다는 것이다.
인수가 0개일 경우에 합은 0일 것이다.
또 다른 예로 ( - 10 12 ) 이 경우 리턴값은 -2가 된다 . 이를 통해 -는 2개의 인수를 가진다는 것을 알 수 있다.
또 다른 예로 ( * 2 3 4 ) 일 경우 리턴값으로 24가 리턴되고 , *는 0개 또는 더 많은 인수를 가질 수 있다는 것을 알 수 있다.
마지막으로 ( / 25 2 ) 일 경우 리턴값으로는 12.5가 리턴되고 , /는 두개의 인수를 가진다는 것을 알 수 있다.
3. LISP는 함수의 인수를 포함하여 모든 것을 평가하려 한다 . 하지만 세가지 종류의 요소들은 그것들이 항상 그것 자체로 평가되고 그 자신의 값을 되돌려 받는다는 점에서 특별하다. ( 숫자들 , 논리적 참을 나타내는 t , 논리적 거짓을 나타내는 nil) 여기서 nil은 빈 리스트인 ( ) 와 같다 .
4. LISP에서 원소나 리스트를 그 값 자체로 사용할 것이라고 알려주는 홑따옴표 사용한다.
5. LISP에서는 setq함수를 사용하여서 값을 할당한다. setq함수는 두개의 인수를 갖고 , 첫 번째 인수는 반드시 변수이어야 한다 . 첫번째 인수는 평가되어서는 안되기 때문에 홑따옴표를 앞에 붙일 수 없다. 두 번째 인수는 홑따옴표가 붙어있지 않으면 평가되며 , 그 결과값이 첫번째 인수 혹은 변수에 할당이 된다. 그 변수는 다른 새로운 값이 할당되기 전까지 이 값을 유지 혹은 저장한다 . 변수들이 평가될 때 그 변수들에 가장 마지막으로 할당된 값이 결과값으로 인지된다 . 이 정의에 따르면 , 정의되지 않은 혹은 전에 어떤 값을 할당하지 않은 변수를 평가하려고 할 때는 에러(error)가 발생한다 .
setq함수는 다음과같이 사용된다.
(setq x 10) : 숫자 10은 그 자체로 평가되고 , x에 할당이 되며 , 결과값 10이 리턴됨
(setq x ( + 3 5 ) ) : x는 ( + 3 5 )로 다시 할당되며 , 그 평가된 결과값 8이 리턴됨
( setq x ‘(+3 5 ) ) : x에는 (+ 3 5)가 자체값으로 할당된다 따옴표가 평가를 방지했기 때문이다
여기에 값자기 y를 찍게 되면 error가 발생한다 . 왜냐하면 변수 y는 정의된 ( 할당된 ) 값이 아니기 때문이다.
6. 리스트의 종류 ( car , cdr , cons , list )
7. Car : 리스트의 첫번째 요소를 되돌려 주는 함수이다.
8. Cdr : 첫번째 요소를 제외한 나머지 요소들로 이루어진 리스트를 되돌려 준다.
9. Cons : 첫번째 요소로 포함시킨 새로운 리스트를 만들어 준다.
10. List : 각 인수를 결합한 또 하나의 리스트를 만들어 준다
è 예제를 통해서 이해해 보자.
( car ‘( a b c ) ) : car는 인수로 하나의 리스트를 가지며 , 첫번째 요소를 리턴값으로 되돌려 주기 때문에 결과값으로는 a
( cdr ‘(a b c ) ) : cdr는 인수로 하나의 리스트를 가지며 , 첫번째 요소가 제거된 리스트를 되돌려 준다 . 결과값은 ( b c ) 이다.
( cons ‘a ‘(b c ) ) : cons는 원소와 리스트 두개의 인수를 가지며 원소가 리스트의 맨 처음에 삽입된 새로운 리스트를 되돌려 준다 . 결과값은 ( a b c )
( list ‘a ‘(b c ) ) : list는 인수를 몇 개라도 가질 수 있으며 , 각 인수를 요소로서 결합한 리스트를 되돌려 준다 . 결과값으로는 ( a ( b c ) )
11. LISP에서는 car cdr car cdr 의 연속을 간략하게 cadadr 로 나타낸다.
12. Append , last , member , reverse 와 같은 함수도 존재한다.
è (append ‘(a) ‘(b c ) ) : 둘 또는 그 이상의 리스트를 하나의 리스트로 통합한다 .결과 값으로는 ( a b c )가 된다.
è (last ‘( a b d ) ) : 마지막 원소를 포함한 리스트를 되돌려 준다 . 결과값으로는 (d)
è (member ‘b ‘( a b d ) ) : 첫번째 인수와 일치하는 요소부터 시작하는 두번째 인수 리스트를 되돌려 준다 . 결과 값으로는 ( b d )
è ( reverse ‘(a ( b c) d ) : 요소들을 역순으로 나열한 리스트를 되돌려 준다 . 결과값으로는 (d ( b c ) a )
'학부공부 > 인공지능' 카테고리의 다른 글
LISP에서의 사용자 정의 함수 , 술어 함수 , 조건문 , 논리함수 (0) | 2018.10.03 |
---|---|
LISP에서의 사용자 정의 함수 , 술어 함수 , 조건문 , 논리함수 (0) | 2018.10.03 |
연습문제를 풀어보자. (0) | 2018.09.27 |
CLISP 맛보기 (0) | 2018.09.21 |
Common LISP ( CLISP ) Download (0) | 2018.09.21 |
#IT #먹방 #전자기기 #일상
#개발 #일상