Lisp 방언 비교, Hyperpolyglot 활용법

제목 : Lisp 계열 언어를 한눈에 비교하는 Hyperpolyglot 활용법
Lisp를 처음 보면 문법은 비슷해 보이는데, 막상 코드를 옮기려 하면 작은 차이에서 자주 막히게 돼요.Common Lisp, Racket, Clojure, Emacs Lisp를 함께 다룬다면 비교식 레퍼런스가 꽤 강력한 도구가 됩니다.
1. Hyperpolyglot Lisp 레퍼런스의 핵심 가치
이 자료는 Lisp 계열 4개 언어를 같은 기능 기준으로 나란히 비교해 보여주는 치트시트예요. 사용된 기준 버전은 SBCL 1.2, Racket 6.1, Clojure 1.6, Emacs 24.5로 다소 오래됐지만, 언어별 기본 문법과 사고방식을 비교하는 데는 여전히 유용합니다.
특히 좋은 점은 단순히 “문법이 다르다”에서 끝나지 않는다는 점이에요. 실행 방법, 변수 선언, 리스트 처리, 해시맵, 함수 정의, 예외 처리, 파일 입출력, 매크로, Java 연동까지 실제 개발 중 자주 찾는 항목이 기능 단위로 정리돼 있습니다.
예를 들어 Clojure 개발자가 Common Lisp 코드를 읽거나, Emacs Lisp로 에디터 자동화를 하려는 개발자가 Lisp 공통 개념을 익힐 때 빠르게 차이를 확인할 수 있어요.

2. 실행 방식과 REPL 비교
가장 먼저 확인할 부분은 코드를 어떻게 실행하고 테스트하는가입니다. Lisp 계열 언어는 대체로 REPL(코드를 즉시 입력하고 결과를 확인하는 대화형 환경)을 중요하게 다루기 때문에, 실행 방식 차이를 아는 것이 학습 속도에 큰 영향을 줍니다.
대표적으로 Common Lisp는 sbcl, Racket은 racket, Clojure는 java -jar clojure.jar, Emacs Lisp는 Emacs 내부의 M-x ielm 같은 방식으로 REPL을 실행합니다.
실무에서는 다음 상황에서 특히 유용해요.
스크립트 실행: 간단한 자동화 파일을 만들 때 shebang 설정을 비교할 수 있어요.컴파일:Racket의raco make,Emacs Lisp의 byte compile처럼 배포 전 최적화 방식을 확인할 수 있어요.REPL 디버깅: 함수 하나를 바로 평가하면서 데이터 흐름을 점검할 때 생산성이 높아집니다.
3. 변수, nil, 리스트에서 드러나는 철학 차이
Lisp는 모두 S-expression(괄호 기반 표현식)을 쓰지만, nil, 빈 리스트, 심볼(symbol)의 의미는 언어마다 다르게 동작합니다. 이 차이를 모르면 조건문이나 리스트 처리에서 예상치 못한 버그를 만나기 쉬워요.
예를 들어 Common Lisp와 Emacs Lisp에서는 nil과 빈 리스트 '()가 사실상 같은 값으로 취급됩니다. 반면 Clojure에서는 nil과 빈 리스트가 구분되며, Racket에서는 #f만 false로 간주되고 빈 리스트는 false가 아닙니다.
리스트 처리도 차이가 있어요. Common Lisp와 Emacs Lisp는 car, cdr, first, rest를 폭넓게 쓰고, Clojure는 first, rest, next 같은 컬렉션 중심 함수가 더 자연스럽습니다. 기존 Lisp 코드를 다른 방언으로 옮길 때는 이 부분을 먼저 점검하는 것이 좋아요.
4. 문자열, 정규식, 날짜 처리의 실무 포인트
자료는 문자열과 정규식, 날짜 처리도 비교합니다. 이 영역은 로그 파싱, 설정 파일 처리, 텍스트 자동화처럼 일상적인 개발 작업에서 바로 쓰이는 부분이라 활용도가 높습니다.
문자열 연결만 봐도 언어별 차이가 있습니다. Common Lisp는 concatenate, Racket은 string-append, Clojure는 str, Emacs Lisp는 concat을 사용해요. 같은 “문자열 붙이기”라도 함수명이 다르기 때문에 검색 시간을 줄이는 데 도움이 됩니다.
정규식도 중요합니다. Common Lisp는 보통 cl-ppcre 라이브러리를 활용하고, Clojure는 Java 정규식 기반의 #"" 표기를 사용합니다. 로그에서 날짜를 추출하거나 특정 패턴을 치환하는 스크립트를 작성할 때, 이 비교표를 보면 바로 알맞은 함수를 찾을 수 있어요.

5. 컬렉션, 함수, 매크로까지 비교해야 하는 이유
Lisp의 진짜 매력은 리스트와 함수, 그리고 **매크로(macro, 코드를 생성하는 코드)**에서 강하게 드러납니다. Hyperpolyglot 표는 이 부분을 언어별로 나란히 보여줘서 각 방언의 설계 철학을 이해하는 데 도움이 됩니다.
예를 들어 map, filter, reduce는 네 언어 모두에서 중요한 함수형 프로그래밍 도구입니다. 하지만 Common Lisp는 mapcar, remove-if-not, reduce를 쓰고, Clojure는 컬렉션 전반에 동일한 함수들을 적용하는 방식이 더 일관적입니다.
매크로도 차이가 큽니다. Racket은 위생적 매크로(hygienic macro, 이름 충돌을 방지하는 매크로)를 강조하고, Common Lisp와 Emacs Lisp는 defmacro와 gensym을 통해 개발자가 직접 충돌을 관리하는 방식에 가깝습니다.
이 차이는 DSL(도메인 특화 언어)이나 반복 코드 제거를 설계할 때 중요합니다. 단순 문법 비교가 아니라, 어떤 언어가 어떤 문제에 더 적합한지 판단하는 기준이 되기 때문이에요.
마무리하며
Hyperpolyglot의 Lisp 비교표는 모든 내용을 외우기 위한 자료라기보다, 언어 간 이동 비용을 줄여주는 지도에 가깝습니다. 특히 Lisp 계열 언어를 하나라도 알고 있다면, 다른 방언을 배울 때 훨씬 빠르게 감을 잡을 수 있어요.
다만 기준 버전이 오래된 만큼 최신 프로젝트에 적용할 때는 공식 문서 확인이 필요합니다. 그래도 Common Lisp, Racket, Clojure, Emacs Lisp의 공통점과 차이를 빠르게 훑고 싶다면, 이 레퍼런스를 옆에 두고 작은 스크립트부터 직접 옮겨보는 것을 추천해요.






