갈루아의 반서재



List Functions

리스트를 다루는 것은 리스프 프로그래밍에서 *아주* 중요한 부분이다. 리스프에서 콘셀을 다루는데는 cons, car, cdr 이라는 3가지 기본 함수가 있다. 


The cons Function


타입과는 무관하게 2개의 데이터를 연결할 경우, 주로 쓰는 방법이 cons 함수를 통한 것이다. 예를 들어, chicken 을 cat 에 연결해보자. 

1
2
[26]> (cons 'chicken 'cat)
(CHICKEN . CAT)
cs

보는 바와 같이 cons 은 괄호안의 점으로 각각의 아이템을 연결한 하나의 객체를 반환한다. 이것은 일반적인 리스트와는 다르다. 가운데 있는 점을 통해 2개의 아이템을 연결하는 콘셀을 만드는 것이다. 그리고 quoting 을 통해 2개의 아이템을 리스프가 코드가 아닌 데이터로 인식하게 했다. 

다른 아이템 대신에 다음과 같이 nil 에 연결할 수도 있다. 

1
2
[28]> (cons 'chicken 'nil)
(CHICKEN)
cs

cat 과는 달리 nil 은 아웃풋에 드러나지 않는다. 여기에는 간단한 이유가 있다. nil 은 리스프에서 리스트를 끝내기 위한 특수한 심볼이기 때문이다. 다음과 같이 나타낼 수도 있다. 

1
2
[29]> (cons 'chicken ())
(CHICKEN)
cs

비어 있는 리스트인 () 는 nil 대신에 사용이 가능하다. cons 함수는 새로운 아이템을 리스트 앞에 추가할 수도 있다. 

1
2
[30]> (cons 'pork '(beef chicken))
(PORK BEEF CHICKEN)
cs

모든 리스트는 콘셀로 만들어져 있기 때문에, (beef chicken) 리스트는 다음과 같은 두 개의 콘셀을 통해 만들어진 것이다. 

1
2
[31]> (cons 'beef (cons 'chicken ()))
(BEEF CHICKEN)
cs

실제로는 다음과 같이 구성되어 있는 것이다. 

1
2
[32]> (cons 'pork (cons 'beef (cons 'chicken ())))
(PORK BEEF CHICKEN)
cs

기본적으로 리스프에서는 콘셀의 연결이나 리스트나 동일한 것이다.