TECO와 vi에서 시작해 MIT의 emacs, Lisp 머신의 ZWEI를 거쳐 오늘날 GNU Emacs+sly로 이어지는 Lisp 해킹 경험을 회고하고, vi에서의 Lisp 개발 경험이 어떤지 묻는 글.
URL: https://funcall.blogspot.com/2025/04/emacs-and-lisp.html
Title: Emacs and Lisp
Abstract Heresies: Emacs and Lisp
===============
컴퓨터 과학과 프로그래밍에 대한 이단적(비정통적) 의견들.
내가 처음 배운 편집기는 라인 프린터에서 쓰는 TECO였다. 작업 중인 코드 줄을 출력한 다음, 커서를 이리저리 움직이는 명령을 내렸다. 종이를 낭비하니 줄을 출력하는 건 피하려 했다. 그래서 원하는 위치에 도달했다고 생각될 때까지 눈감고(출력 없이) 커서를 움직인 다음, 문자를 삽입하기 시작했다. 제대로 됐다고 생각되면, 편집된 줄을 출력해 보았다.
한 학부생이 내가 고생하는 걸 보고 왜 vi를 쓰지 않느냐고 물었다. vi라는 걸 들어본 적이 없던 나는, 화면에서 코드를 보면서 커서를 시각적으로 움직인 뒤 삽입 모드로 들어가 텍스트를 추가할 수 있다는 사실에 놀랐다. vi를 쓰자, TECO를 쓸 때보다 생산성이 몇 자리수는 올라갔다.
80년대 초에 ’tute에 왔을 때, 컴퓨터 계정은 컴퓨터 과학 과목을 수강하는 학생들에게만 통상 발급되었다. 나는 아직 전공을 컴퓨터 과학으로 정하지 않았기 때문에 계정이 없었다. 하지만 Student Information Processing Board는 희망하는 학생들에게 Multics 계정을 발급해 주었고, 나는 등록했다. Multics 단말기는 지하에 있었는데, 음향 결합 모뎀으로 다이얼업 연결을 했다. 수화기를 끼워 넣는 고무 컵 두 개가 달린 그런 모뎀 말이다.
AI Lab에서는 모두 집에서 만든 편집기 emacs를 썼고, Multics용 포트도 있었다. 나는 vi를 버리고 emacs를 배웠다. 패러다임은 달랐지만, 어느 쪽이 우월하다고는 느끼지 않았다. 전공을 컴퓨터 과학으로 선언하자, Decsystem 20 머신을 쓰는 AI Lab 계정을 받았다. 그곳의 편집기는 TECO에 에디터 매크로(emacs) 패키지를 올린 것이었다.
S&ICP를 수강할 때, HP9836 “Chipmunks”로 된 실습실에서 MIT Scheme을 썼다. Chipmunks는 시분할이 아닌 PC였고, 각자 하나의 Scheme 머신처럼 동작했다. 코드 편집을 위해 emacs 클론도 내장되어 있었다.
AI Lab에는 ITS(Incompatible Timesharing System, 부적합 시분할 시스템)를 돌리는 머신이 몇 대 있었다. 거기서 Maclisp를 돌릴 수 있었지만, Maclisp는 너무 무겁게 돌아가서 램을 1메가바이트 넘게 쓰곤 했다. Maclisp 인스턴스가 몇 개만 떠도 머신이 주저앉았다. 랩에서는 단일 사용자 컴퓨터인 Lisp Machine을 개발했고, 이 머신은 ZetaLisp(맥리스프의 후속)을 돌렸다. Lisp 외에도, Lisp 머신은 ZWEI 편집기를 돌렸다. ZWEI는 “Zwei Was Eine Initially, and Eine Is Not Emacs”(Zwei는 처음엔 Eine였고, Eine는 Emacs가 아니다)의 약자이고, Emacs 자체가 아니라 Zetalisp로 작성된 emacs 클론이었다.
ZWEI는 Lisp 환경과 통합되어 있었다. ZWEI 편집기 안에 Lisp 객체를 삽입하면 그 객체의 출력 표현이 편집 텍스트에 나타났다. 이 출력 표현은 마우스로 상호작용할 수 있었고 자체 컨텍스트 메뉴를 가졌다.
Lisp 머신을 쓰지 않는다면, 선택지는 Unipress Emacs와 Gosling Emacs였는데, 이들은 “Unix”라는 새로운 OS에서 돌릴 수 있었다.
그 무렵(80년대 후반), Stallman이라는 해커가 새 OS를 쓰기로 결심했다. 첫 과제로 편집기를 쓰기로 했고, 자신만의 Lisp 방언으로 작성한 새 버전의 Emacs를 만들었다.
Lisp을 쓰고 싶다면, Emacs를 통해 Lisp과 상호작용했다.
요즘 나는 GNU Emacs를 쓰고 sly 패키지를 로드한다. Sly는 slime의 포크로, 다른 프로세스에서 도는 Lisp을 위한 IDE로 GNU Emacs를 바꿔 준다. 이 인터페이스는 Lisp 머신에서 ZWEI를 쓸 때 누리던 것의 상당 부분을 제공한다. 부분식 평가, 매크로 확장과 프로그램 컴파일, 출력 수집, 그리고 GNU Emacs 안에서 Lisp 디버거를 실행할 수 있다.
Emacs와 Lisp는 MIT에서 함께 공진화했고, Emacs는 줄곧 Lisp의 프런트엔드로 쓰였다. 나는 다시 vi로 돌아간 적이 없고, 어쩌다 써야 할 때면 답답하기만 했다(그건 vi 사용법을 전부 잊어버렸기 때문이다).
어떤 사람들은 Emacs가 도저히 쓸 수 없다고 느끼고 vi를 강력히 선호한다는 걸 안다. vi에서 Lisp을 해킹하는 경험은 좋은가?
Posted by Joe Marshall at 오전 7:54![]()
![]()
이메일로 보내기블로그에 게시!X에 공유Facebook에 공유Pinterest에 공유
레이블: Emacs, Lisp, Lisp Machine, vi

익명 님이 말하길... 내가 Lisp를 처음 접한 건 ’74년 UT 오스틴에서 학부 과목으로 언어들(Lisp, SNOBOL, COBOL)을 들을 때였다. 학부생들은 보통 컴퓨팅 센터의 CDC 6x00 컴퓨터를 천공 카드와 텔레타이프를 써서 사용했다. 그보다 더 고통스러울 수는 없다. AI 대학원생이 되고 나서는 DEC-10과 (기억이 가물가물하지만) SOS를 쓸 수 있었다. 하지만 80년대 초까지는 VAX들에서 Gosling & Unipress Emacs, 그리고 Symbolics와 (나중엔) TI Explorer(Zmacs)에서는 ZWEI였다. 80년대 말에는 Sun과 SGI 워크스테이션에서 GNU Emacs로 넘어갔다.
vi로 Lisp 코딩을 해 본 적은 없다. 다만 한 번—아주 오래 전에—그냥 어떻게 보이는지 보려고 gvim으로 Lisp 코드를 띄워 본 적은 있지만, 작업하려고 한 것은 아니었다.

익명 님이 말하길... 왜 Slime 대신 Sly를 선택하셨는지 궁금합니다.
Joe Marshall 님이 말하길... 딱히 이유는 없다. 그냥 궁금해서 써 보았다. 나는 새롭고, 개선되었고, 대안적이며, 비표준인 것들에 끌리는 편이다. 내가 알기론 Sly와 Slime은 대체로 엇비슷하다.

Paul Fuqua 님이 말하길... 나는 MIT에서 당신보다 조금 먼저였다. SICP 과목에서 두 학기 동안 조교를 했고, 그때 Decsystem 20 중 한 대에서 Scheme(맥리스프 프로그램으로)을 돌렸다. 그게 Lisp에 입문한 계기였고, 첫 학기에는 학생들보다 일주일 앞서 바삐 배우곤 했다.
내 학부는 CDC 6600에서 라인 에디터를 썼고, 나는 프로젝트로 라인 에디터를 하나 작성하기도 했다. Emacs는 내가 본 첫 스크린 에디터였다. Scheme 관련 것들을 돌리는 정해진 방법으로 소개받았고, 그 이후로 쭉 써 왔다. 운영체제도 만져서 vi도 최소한의 조작은 할 수 있게 배웠다.
내 대학원 프로그램은 제안된 초컴퓨터 아키텍처를 시뮬레이션하는 데 Lisp 머신을 사용했고, 그것이 TI에서 Explorer 작업(끝까지)을 하는 일로 이어졌다. 그 뒤에는 다른 시뮬레이터들을 Lisp로 했다. 결국에는 일반적인 Lisp에서 벗어나야 하는 분야로 갔지만, 여전히 스크립트에는 (scheme->c, scsh, clisp) Lisp을 쓴다. 다만 제품화는 보통 파이썬이 더 쉽다.
여담: 이메일도 emacs로 쓴다. MIT의 Teco emacs에서 Babyl 모드로 시작했고, 그다음엔 Lisp 머신의 메일 리더(그것만 하려고 Explorer를 계속 살려 두기도 했다), 이어서 VM, 지금은 mu4e를 쓴다.

익명 님이 말하길...
나는 어떤 사람들은 Emacs가 도저히 쓸 수 없다고 느끼고 vi를 강하게 선호한다는 걸 안다. vi에서 Lisp을 해킹하는 경험은 좋은가?
Vim 사용자입니다. nvim 붐은 끝내 잘 이해하지 못했어요.
Tamas Kovaks의 Slimv가 있고, 많은 대소문자 상관없는 여러 종류의 Lisp들과 일부 파생물에서 억지로라도 작동하게 할 수 있습니다. 저는 보통 다른 tmux/screen 탭에서 SBCL에 slimv를 물려 둡니다. 그 구성은 단출하지만, 디버거, 인스펙터와 디스크립터, 약간의 괄호 관리, 표현식과 폼을 REPL로 쏘기 등을 제공하고, 제게는 그걸로 충분합니다.
물론 Vim과 Slimv가 제공하는 기능 중 제가 활용하지 않는 것도 많습니다. 요즘은 주로 Common Lisp를 일시적인 글루 코드나 취미 프로젝트에 쓰거든요. 하지만, 비교적 최근 밈을 인용하자면:
평화로운 삶이죠

익명 님이 말하길... 다른 댓글러와 마찬가지로, 저도 vim에서 lisp을 할 때 slimv를 씁니다. 꽤 사랑스럽습니다. 딱 원하는 대로 동작하거든요.
구독: 게시글 댓글(Atom)
Powered by Blogger.