도입
이 글은 Ruby의 영향원을 탐구하는 시리즈의 일환으로, Perl과 Smalltalk에 이어 Lisp에 초점을 맞춥니다. 저자는 Ruby의 창시자인 Yukihiro "Matz" Matsumoto가 Lisp를 포함한 여러 언어의 장점을 융합하여 Ruby를 만들었음을 언급하며, Lisp의 독특한 문법과 '코드와 데이터의 동일성'이라는 핵심 개념을 소개합니다. 비록 Lisp 경험이 오래되었지만, Lisp의 본질적인 특징들이 Ruby에 미친 영향을 깊이 있게 탐구하고자 합니다.
Lisp의 기본 구조와 특징
Lisp는 괄호로 둘러싸인 S-표현식을 핵심 문법으로 사용하며, 코드와 데이터 사이에 문법적 구분이 없는 독특한 특징을 가집니다. 리스트의 첫 번째 요소는 함수처럼 동작하고 나머지는 인수가 되며, quote는 리스트를 코드가 아닌 데이터로 취급하게 합니다. eval 함수는 이를 평가합니다. def, if와 같은 ‘특수 형식(special form)’은 일반적인 평가 규칙과 다르게 동작합니다. 주요 방언으로는 Common Lisp, Scheme, Clojure가 있습니다.
Lisp의 역사와 매크로
Lisp는 1950년대 후반에 시작되어 AI 연구와 초기 자유 소프트웨어 커뮤니티의 핵심 언어였습니다. ‘Lisp Curse’ 이론처럼 강력한 표현력이 오히려 대중화를 방해했다는 시각도 있습니다. Lisp의 강력한 메타프로그래밍 기능인 ‘매크로(macro)’는 코드와 데이터의 경계를 활용하여, 실행 가능한 새로운 코드(리스트)를 동적으로 생성합니다. 이는 Lisp를 사용자가 원하는 언어 형태로 변형할 수 있게 하며, Ruby의 메타프로그래밍과 유사한 정신을 공유합니다.
결론
Lisp는 마치 잘 설계된 레고 블록처럼, 작은 구성 요소를 조합하여 모든 것을 만들어야 하는 독특한 경험을 제공합니다. 이는 Perl의 스위스 아미 나이프나 Smalltalk의 완전한 컴퓨터와는 다른 접근 방식입니다. Lisp는 학술 언어이자 초기 오픈소스 커뮤니티에서 큰 영향력을 가졌지만, '코드와 데이터의 동일성'이 AI 기술로서 기대만큼 효과적이지 않다는 점이 드러났습니다. 그럼에도 불구하고 Ruby는 Lisp로부터 중요한 '정신적 영향'을 받았습니다. 특히 '모든 것이 표현식'이라는 개념, 메타프로그래밍을 활용한 도메인 특화 언어(DSL) 생성 아이디어, 그리고 문자열과 심볼을 구분하는 방식 등에서 Lisp의 흔적을 찾을 수 있습니다. 저자는 이 시리즈를 통해 다양한 프로그래밍 언어의 매력을 탐구하는 즐거움을 강조하며 글을 마무리합니다.