#git object model을 보니 clojure persistent vector가 생각났다

less than 1 minute read

이런 persistent vector가 있다. 왜 persistent인가 하면 vector가 생성된 후, 변경할 수 없기 때문이다. 즉, 4를 5로 바꾸고 싶다면 5를 생성해 간선(edge)으로 연결하고 4를 연결하는 간선을 제거한 새로운 vector를 생성해야 한다.

nodes로 간단히 표현했다. 이 글에서 중요한 요소가 아니니깐. 실제로는 공유할 수 있고 index로 접근할 수 있게 만든다.

nil

추가를 해보자. 5를 추가한 B vector를 만들려고 한다. 만약 이렇게 만들면? 캐망. B vector는 만족할지 몰라도 A Vector가 변경된다.

nil

B vector를 만들려면 이렇게 만들어야 한다. 무식하게 1, 2, 3, 4를 복사해서 만들 수도 있지만 여기서는 변경할 수 없는 값이니 연결해도 안전하다. 여기서 node를 다 새로 만드는 것처럼 표현했지만, node 중 공유할 수 있는 건 공유한다.

그러고 보니 최근에 본 거랑 많이 닮았다.

nil

그래. git object model은 clojure persistent vector와 닮았다. git은 파일로 저장하고 clojure는 메모리에 저장한다.

이제 다시 Rich Hickey의 Are We There Yet? 발표자료를 보니 더 이해가 잘 된다. 시간 개념을 설명하면서 VCS(version control system)을 빼놓을 수 없다. 게다가 git object model은 단순해서 비교하면서 이해하기에도 그만이다.

참고