갈루아의 반서재


Common Lisp: LIST - the most versatile data type (3)




Designed by Freepik




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를 반환한다. CONSPLISTP의 차이점은 NIL에 대한 처리방식에 있다. NIL은 cons cell 이 아니라 리스트이다.

3) ATOM 는 cons cell 이외의 것이 입력되면 T 를 반환한다. 그러니깐 ATOM CONSP 는 반대로 작동한다. 하나가 T 를 반환하면 다른 하나는 NIL을 반환한다. 숫자와 심볼은 분리될 수 없으므로 atomic 이다. 비어있지 않은 리스트는 atomic 하지 않다. FIRST 와 REST 를 통해 나눌 수 있기 때문이다.  

4) NULL는 입력이 NIL 이면 T를 반환한다. NOT 과 동일하게 작동한다. 하지만 관례상 리스트가 비어있는지 확인하고 싶을 때는 NULL을 사용한다.