clisp chapter3
LISP에서 코드 구성
Lisp에서는 코드를 List로 구현한다.
그 리스트 안에는 심볼, 숫자, 그리고 문자열을 넣을 수 있다.
- 심볼
심볼은 문자, 숫자, +-/*=...등 기호로 이루어져있다.
그리고 심볼에서는 대소문자 구분을 하지 않는다.
따라서 다음과 같은 fooo, FoOo는 구분하지 않는다.
[1]> (eq 'fooo 'FoOo)
T
- 숫자
리스트는 실수형과 정수형을 모두 지원한다.
단, 두 수를 구분한다. 즉 1과 1.0을 다른 수로 인식한다.
다음과 같은 수식에서는 정수형 숫자를 실수형으로 바꾸고 결과를 실수형으로 리턴한다.
[2]> (+ 1 1.0)
2.0
리스트에서 정수형은 매우 큰 수를 계산할 수 있다.(일반적인 C++이나 JAVA보다)
다음 식은 expt는 53의 53 제곱이다.
[3]> (expt 53 53)
24356848165022712132477606520104725518533453128685640844505130879576720609150223301256150373
리스트에서 다음과 같이 두 정수를 나눌 때 다른 언어와 달리 유리수의 형태로 줄 수 있다.
[4]> (/ 4 6)
2/3
다음과 같이 나누는 수가 실수라면 무한소수로 나타낸다.
[5]> (/ 4.0 6)
0.6666667
- 문자열
문자열은 큰 따음표를 이용하여 표현한다.
[6]> (princ "Tutti Frutti")
Tutti Frutti
cf) princ 함수는 문자열을 출력하는 함수이다.(REFL가 출력하는 부분은 생략)
데이터 모드
코드가 아닌 데이터를 만들 때 사용한다.
데이터화 하고 싶은 요소에 '(quotation mark)를 붙여서 사용한다.
[7]> '(expt 2 3)
(EXPT 2 3)
리스트
리스프에서는 데이터와 코드를 전부 리스트로 관리한다.
리스트는 콘셀 구조로 이루어져있다.
콘셀은 2개의 박스로 구성된 포인터 구조이다.
각각의 박스는 다른 콘셀을 가르키거나 데이터를 가리킬 수 있다.
리스트 함수
- cons
두 데이터를 연결하고 싶다면, cons함수를 사용한다.
cons를 사용하면 메모리를 할당하여 콘셀을 만들고, 각 콘셀 칸에 객체의 reference를 만든다.
[8]> (cons 'chicken 'cat)
(CHICKEN . CAT)
칸을 빈칸으로 만들고 싶으면 nil을 삽입하면 된다.
nil은 리스트를 끝내는데 사용하는 특별한 심볼이다.
[9]> (cons 'chicken 'nil)
(CHICKEN)
다음과 같이 여러 object를 연결할 수도 있다.
(cons 'pork (cons 'beef (cons 'chicken ())))
[12]> (cons 'pork (cons 'beef (cons 'chicken ())))
(PORK BEEF CHICKEN)
- car
콘셀에서 첫 번째 항목을 구할 때 사용한다.
(car '(pork beef chicken))
[13]> (car '(pork beef chicken))
PORK
- cdr
콘셀에서 두 번째 항목을 구할 때 사용한다.
(cdr '(pork beef chicken))
[14]> (cdr '(pork beef chicken))
(BEEF CHICKEN)
car, cdr를 이용해서 다음과 같은 함수들도 만들어서 사용할 수 있다.
[15]> (cadr '(pork beef chicken))
BEEF
(cadr은 cdr, car를 순서대로 적용한 함수)
car, cdr를 최대 4개까지 조합한 함수를 사용할 수 있다. (cadadr 이런 식으로)
- list
cons를 중첩하지 않고 편하게 리스트를 만들 때 사용하는 함수
[18]> (list 'pork 'beef 'chicken)
(PORK BEEF CHICKEN)