커먼 리스프가 아직도 쓰인다고요?
'리스프'라고 하면 대학교 프로그래밍 언어 수업에서 한 번 스쳐 지나간 기억이 전부인 분도 많을 거예요. 커먼 리스프(Common Lisp)는 1984년에 표준이 나온 언어인데, 놀랍게도 지금도 활발하게 쓰이는 현장이 있어요. 그러다 보니 주기적으로 '모던 커먼 리스프'라는 키워드로 지금 시대에 맞는 방식으로 쓰는 법을 정리한 자료들이 나오는데, 최근 공개된 FSet 기반 모던 CL 문서가 그 연장선이에요. 오늘은 이게 뭐고, 왜 관심 있게 볼 만한지 친절하게 풀어볼게요.
FSet이 뭐예요
FSet은 Functional Set(함수형 집합 컬렉션) 라이브러리예요. 영어 약자 그대로 함수형 스타일의 자료구조 모음인데, 한국 개발자들에게 친숙한 비유로 바꾸자면 Clojure의 불변(persistent) 컬렉션과 거의 같은 개념이라고 보면 돼요. 리스트, 셋, 맵, 시퀀스 같은 컬렉션인데 '수정 불가능(immutable)'이라는 특징이 있어요. 값을 추가하거나 지우면 원본이 바뀌는 게 아니라 새로운 컬렉션이 반환되는 거죠.
이게 왜 좋으냐면, 여러 곳에서 같은 데이터를 공유해도 예상치 못한 변경이 일어나지 않아요. 예를 들어 자바스크립트에서 배열을 함수에 넘기고 그 함수 안에서 push를 하면 원본이 바뀌잖아요? 이걸 막으려고 스프레드 연산자([...arr, x])로 복사하거나 Immutable.js 같은 라이브러리를 쓰는 건데, 매번 전체 복사하면 느리고 비효율적이에요. FSet은 내부적으로 트리 구조를 써서 바뀐 부분만 새로 만들고 나머지는 공유해요. 이걸 구조 공유(structural sharing)라고 하고, Clojure나 Scala의 불변 컬렉션도 같은 원리로 작동해요.
커먼 리스프의 기본 컬렉션은 뭐가 문제였나
커먼 리스프의 기본 자료구조는 주로 cons cell 기반의 linked list와 해시 테이블, 벡터예요. 문제는 이 중 대부분이 mutable(변경 가능)하다는 거예요. 여러 스레드가 같은 해시 테이블을 건드리면 락을 잡아야 하고, 함수형 스타일로 코드를 짜고 싶어도 컬렉션이 도와주질 않아요. 또 하나, 표준 컬렉션 API가 일관성이 없어요. 리스트에는 mapcar, 벡터에는 map, 해시 테이블에는 maphash를 쓰는 식이라 같은 개념을 자료구조마다 다른 이름으로 호출해야 해요.
FSet은 이 두 문제를 한꺼번에 해결해요. 모든 컬렉션에 공통된 제네릭 함수(lookup, with, less, image 등)를 제공하고, 내부적으로는 변경 불가능한 트리 기반이에요. 그래서 코드가 훨씬 선언적이고 병렬성에도 유리해요.
모던 CL 문서가 다루는 것
이번에 공개된 문서는 단순히 FSet API 레퍼런스가 아니라 '오늘날 커먼 리스프를 쓸 때 어떤 스타일로 쓰는 게 좋은가'에 대한 안내서에 가까워요. 예제를 보면 해시 테이블 대신 FSet의 map을 쓰고, 리스트 대신 seq를 쓰며, 반복(iteration)은 CL 표준의 loop 매크로 대신 FSet이 제공하는 고차 함수(image, filter, reduce)를 쓰라고 권하죠. 이게 뭐냐면, 자바로 치면 for 루프 대신 Stream API를 쓰는 거랑 비슷한 스타일 변화예요.
또 흥미로운 건 bag(다중집합)과 seq(시퀀스)처럼 표준 CL에는 없는 자료구조도 제공한다는 점이에요. bag은 원소가 중복 가능한 집합인데, 예를 들어 단어 빈도를 세거나 장바구니 수량을 표현할 때 유용해요. seq는 리스트와 벡터의 장점을 합친 구조라서 인덱스 접근도 빠르고 앞뒤 추가도 빠르고요.
다른 언어 생태계와 비교
Clojure는 처음부터 불변 컬렉션을 표준으로 깔고 시작했고, Scala는 scala.collection.immutable을 별도 제공해요. Haskell은 아예 mutable이 예외적인 언어죠. FSet은 커먼 리스프를 이 흐름에 맞춰주는 다리 역할이에요. 리스프 특유의 매크로 시스템과 REPL 기반 개발은 그대로 유지하면서, 최신 함수형 패러다임의 장점을 얹는 조합인 거죠.
비슷한 시도로 Serapeum, Alexandria, Trivia 같은 라이브러리들도 커먼 리스프를 현대화하고 있어요. Alexandria가 유틸리티 함수의 표준이 됐다면, FSet은 자료구조의 표준 자리를 노리는 느낌이에요.
한국 개발자에게 주는 시사점
현실적으로 한국에서 커먼 리스프로 프로덕션을 운영하는 곳은 거의 없어요. 그럼에도 이 이야기를 소개하는 이유는 두 가지예요. 하나는 언어와 패러다임의 역사를 이해하는 것 자체가 설계 감각을 키워준다는 거예요. 지금 우리가 쓰는 Redux, RxJS, Elixir의 불변 데이터, React의 순수 컴포넌트 모두 함수형 프로그래밍의 문법을 빌려온 건데, 그 뿌리에 있는 리스프를 한 번 만져보면 현재 도구들의 설계 의도가 훨씬 잘 보여요.
다른 하나는 레거시 언어도 생태계가 진화한다는 사실이에요. 자바스크립트가 ES6 이후 완전히 다른 언어처럼 쓰이게 된 것처럼, 커먼 리스프도 FSet, Bordeaux-threads, SBCL 같은 현대적 도구들과 함께 쓰면 꽤 쾌적해요. 혹시 회사에서 오래된 리스프 코드를 유지보수해야 하는 상황이 오면, 이 문서가 길잡이가 될 수 있어요.
개인 프로젝트나 토이 프로젝트로 써보는 것도 추천드려요. SBCL(Steel Bank Common Lisp) 컴파일러는 무료이고 성능도 좋고, Emacs + SLIME 조합의 REPL 경험은 여전히 많은 언어 중에서도 손꼽히게 인터랙티브해요. 함수형 사고를 기르는 훈련용으로는 꽤 좋은 환경이에요.
마무리
정리하면, FSet은 커먼 리스프에 Clojure스러운 불변 컬렉션을 가져와서 현대 함수형 스타일을 가능하게 해주는 라이브러리이고, 이번 모던 CL 문서는 그 사용법을 정리한 안내서예요. 여러분은 업무에서 불변 자료구조를 적극적으로 쓰시나요, 아니면 mutable이 더 직관적이라고 느끼시나요? 팀 단위로 이 스타일을 도입했을 때의 경험담이 있다면 궁금해요.
🔗 출처: Hacker News
TTJ 코딩클래스 정규반
월급 외 수입,
코딩으로 만들 수 있습니다
17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공