Common Lisp: LIST - the most versatile data type (3)
1. 리스트
리스트 함수는 새로운 NIL로 끝나는 cons cell 체인을 만든다. CONS는새로운 단일의 cons cell 을 만든다는 것에 비추어보면, 두 번째 입력이 위치한 리스트에 첫 번째 입력을 더하는 것이다.
리스트 함수는 완전히 새로운 cons cell 체인을 만드는 것이다. 괄호 표기법으로 보자면, 그 결과 리스트 함수는 입력이 갖고 있는 것보다는 한 단계 더 많은 괄호를 가지게 된다.
1) 리스트는 새로운 3개의 cons cells을 할당한다.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FOO |
|
|
BAR |
|
|
BAZ |
|
|
|
2) CAR 포인터를 채운다.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| ● |
|
| ● |
|
| ● |
|
|
|
|
| ↓ |
|
| ↓ |
|
| ↓ |
|
|
|
|
| FOO |
|
| BAR |
|
| BAZ |
|
|
|
3) CDR 포인터를 채운다. 첫 번째 셀에 포인터를 반환한다.
Result of LIST
● |
|
|
|
|
|
|
|
|
|
|
|
| ↘ |
|
|
|
|
|
|
|
|
|
|
|
| ● | ● | → | ● | ● | → | ● | ● | → | NIL |
|
| ↓ |
|
| ↓ |
|
| ↓ |
|
|
|
|
| FOO |
|
| BAR |
|
| BAZ |
|
|
|
LIST 는 실제 새로운 cons cells 체인을 만듬으로써 작동한다. 셀의 CAR 부분은 LIST가 받은 입력을 가리킨다. LIST 결과는 체인의 첫 번째 셀에 대한 포인터이다.
CONS 는 하나의 cons cell 을 만들지만, LIST 는 입력의 개수에 상관없이 그만큼 cons cell 체인 리스트를 만든다.
|
|
|
|
|
|
|
|
|
|
|
|
ZORT | → | CONS |
|
|
|
|
|
|
|
|
|
|
| → | (ZORT) |
|
|
|
| ||||
NIL | → |
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ZORT | → | LIST |
|
|
|
|
|
|
|
|
|
|
| → | (ZORT NIL) |
|
|
|
| ||||
NIL | → |
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ABLE | → | CONS |
|
|
|
|
|
|
|
|
|
|
| → | (ABLE BAKER CHARLIE) |
|
|
|
| ||||
(BAKER CHARLIE) | → |
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ABLE | → | LIST |
|
|
|
|
|
|
|
|
|
|
| → | (ABLE (BAKER CHARLIE)) |
|
|
|
| ||||
(BAKER CHARLIE) | → |
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
LIST를 이해하는 또 다른 방법은 연이은 CONS 박스라고 생각하는 것이다. 예를 들면 다음과 같다.
|
|
|
|
|
|
|
|
|
|
|
|
COCKATOO | → | LIST |
|
|
|
|
|
|
|
|
|
|
| → | (COCKATOO REVIEW) |
|
|
|
| ||||
REVIEW | → |
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
2. 리스트 원소 교체하기
리스트의 첫 번째 원소를 다른 심볼 WHAT 으로 바꿀려고 한다고 하자.
먼저 REST 함수를 통해서 첫째 원소를 제외한 나머지를 가져온 다음, 심볼 WHAT 을 CONS 를 통해 앞서 가져온 서브리스트에 합하면 된다. 예를 들어, (TAKE A NAP) 리스트의 REST는 (A NAP) 이고 여기에 심볼 WHAT을 콘싱하면 (WHAT A NAP) 리스트를 얻게 되는 것이다. 이러한 과정에서 실제로 리스트의 일부가 교체되는 것이 아니라, 새로운 cons cell 을 생성함으로써 새로운 리스트를 생성하게 될 뿐이다.
3. 리스트 술어
1) LISTP 는 리스트가 입력되면 T를 반환한다. 그렇지 않은 경우에는 NIL을 반환한다.
2) CONSP 는 cons cell이 입력되면 T를 반환한다. CONSP와 LISTP의 차이점은 NIL에 대한 처리방식에 있다. NIL은 cons cell 이 아니라 리스트이다.
3) ATOM 는 cons cell 이외의 것이 입력되면 T 를 반환한다. 그러니깐 ATOM 과 CONSP 는 반대로 작동한다. 하나가 T 를 반환하면 다른 하나는 NIL을 반환한다. 숫자와 심볼은 분리될 수 없으므로 atomic 이다. 비어있지 않은 리스트는 atomic 하지 않다. FIRST 와 REST 를 통해 나눌 수 있기 때문이다.
4) NULL는 입력이 NIL 이면 T를 반환한다. NOT 과 동일하게 작동한다. 하지만 관례상 리스트가 비어있는지 확인하고 싶을 때는 NULL을 사용한다.
'프로그래밍 Programming' 카테고리의 다른 글
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80 (0) | 2017.05.10 |
---|---|
장고 임포트(import) 순서 및 명시적 성격의 상대 임포트 (0) | 2017.05.09 |
LISP - CAR/CDR Pronunciation Guide (0) | 2017.04.24 |
리스프 리스트 데이터 타입 Common Lisp: LIST - the most versatile data type (2) (0) | 2017.04.24 |
리스프 리스트 데이터 타입 Common Lisp: LIST - the most versatile data type (1) (0) | 2017.04.22 |