Tag Archives: LISP

볼만한 LISP 강좌

LISP 초보인 사람들에게는 좀 어려울수도 있지만… LISP로 Linear Algebra(선형대수) 패키지와 Ray Tracing을 작성하는 비디오가 있어서 소개합니다. 당연히(!) 영어로 되어 있고, 어느정도 LISP에 대한 기본적인 지식이 있어야합니다. 강좌보면서 느끼는거지만,,, LISP 매크로는 대부분의 사람들에게는 어렵고 헷갈리나 봅니다. 저는 가끔씩 LISP을 하다보니 볼때마다 헷갈리는군요.

http://home.in.tum.de/~lehmanna/lisp-tutorial.html

Emacs와 SLIME 사용해서 개발하니, 남들이 어떻게 사용하는지 보면 도움이 되리라 생각되네요.

SLIME 사용방법

M은 메타(Alt)키, C는 Ctrl키.

Emacs든 vi 든 caps lock은 Ctrl로 바꿔 쓰는게 편합니다.

Emacs의 기본적인 사용법은 알고 있다고 가정하고 설명들어갑니다. 그리고 윈도우즈에서 Emacs, CLISP, Slime 인스톨 방법은 이전 글을 참고하세요.

Emacs를 시작하고 “M-x slime”으로 slime을 시작합니다. 잠깐 기달리면 REPL (Read-Evaluate-Print Loop)가 뜹니다. Slime은 크게 두가지 프로그램으로 구성되어 있는데, Common Lisp로 돌아가는 서버 부분(Swank)과, Emacs Lisp로 돌아가는 Front-end 부분이 있습니다. 설정에 따라서 Swank를 서버쪽에 띄우고 로컬에서 Emacs와 Slime Client를 띄우고 작업할수도 있습니다.

REPL에서 Lisp expression을 쳐서 간단한 작업을 할수 있지만, 본격적인 프로그래밍을 위해서는 파일로 작업해야 편합니다. 먼저 C-x C-f로 기존 파일이나 새파일을 열고 Lisp 코드를 짜면 됩니다. 원하는 S-exp을 REPL에서 실행하도록 보내는 단축키 몇개는 지속적으로 사용하게 되고요, Lisp 코드를 편집할때 쉽게 해주는 단축키들이 많은데, 알아두면 도움이 됩니다. 모든 단축키를 설명한 것은 아니니 자세한건 slime 메뉴얼을 구해서 보시기 바랍니다.

  • C-c C-c: 현재 top level form을 컴파일합니다. 주로 defun, defmacro등을 등록할때 사용.
  • C-x C-e: 현재 커서 바로 이전 expression을 실행(Evaluate)합니다. 디버깅할때 유용합니다.
  • C-M-x: 현재 top level form을 실행(Evaluate)합니다. 리턴값이 밑에 표시되고 한번에 입력할수 있기 때문에 많이 씁니다.
  • C-c C-z: REPL로 이동합니다. 이때 화면이 나눠지는데, C-x o로 양 창을 이동할수 있습니다.
  • TAB: 현재줄을 indent합니다. 여러줄을 입력할때 다음줄로 넘어갈때 항상 TAB를 눌러 주는게 좋습니다. 안그러면 자동 괄호 닫기 기능등이 비정상적으로 작동합니다.
  • C-j: 다음줄로 가서 indent합니다. Enter 누르고 TAB 누르는것과 같습니다. 익숙해지면 편하죠.
  • C-c C-q: 열린 괄호를 모두 닫습니다.
  • C-c M-q: 현재 form을 자동 indent합니다.
  • C-c C-k: 현재 파일을 컴파일&로드 합니다.
  • M-. : 해당 definition으로 이동
  • M-, : 이전으로 이동
  • C-c C-d h: 현재 단어를 hyperspec에서 찾아봅니다.
  • C-c TAB 또는 C-M-i : autocompletion. 누르면 창 나눠지면서 포커스 다른 창으로 이동하는데 여기서 C-n,C-p 등으로 원하는 단어 선택해서 Enter치면 완성되고, q를 누르면 취소됩니다.
  • C-c M-i : fuzzy autocompletion. with-output-file을 빨리 칠때 wof하고 C-c M-i치면 w*-o*-f*로 되어있는 거도 포함되어 선택할수 있습니다. 이게 원래 autocompletion보다 편해서 .emacs에서 디폴트로 변경해서 사용하고 있습니다.
  • C-M-n, C-M-p : expression 하나씩 앞뒤로 이동합니다. C-M-u은 상위로 이동합니다.
  • C-c Enter : Macro Expand-1. 매크로 짤때 필수죠.

여기까지가 에디터에서 사용하는 명령들이고, REPL에서도 에디터에서 사용할수 있는 단축키들이 대부분 그대로 통합니다. 추가적으로

  • Enter: Evaluate
  • C-Enter: 괄호 닫고 Evaluate
  • Shift-Enter: Eval하지 않고 다음줄로 내려갑니다.
  • C-↑, C-↓, M-p, M-n : 히스토리 기능
  • ,q : SLIME 종료 (Swank도 종료)

다음은 디버깅 관련 단축키입니다.

  • C-Shift-i: inspect. 원하는 변수등에서 누르면 자세한 정보가 표시됩니다.
  • Ctrl-c Ctrl-t: trace. 원하는 함수이름에서 trace기능을 켜고 끌수 있습니다. trace 기능이 켜 있으면 해당 함수가 호출될때 인자와 리턴값이 표시됩니다. trace된 함수들을 모두 크기 위해서는 REPL에서 (untrace) 하면 됩니다.

실행(Evaluation)중 오류가 나면, 디버거가 뜹니다. 맨위에 오류가 설명되고, 그 밑에 재시작, 끝내기등 실행 재개에 대한 메뉴가 나옵니다. 왼쪽에 숫자를 입력하면 메뉴가 선택되지만, 숫자에 대한 메뉴가 일정하지 않기 때문에 다른 단축키를 알아두는게 좋습니다.

  • q: 종료 (quit)
  • 0: 스택 한단계 위로 이동

밑에는 스택(Backtrace)이 표시되는데, 해당 라인으로 이동하여 Enter를 치면 자세한 내용이 표시됩니다.

  • M-n, M-p: 위/아래로 이동. 새로 이동한 줄의 자세한 내용이 표시되고 그전보던 줄의 자세한 내용은 감춰집니다.
  • v : 해당 스택 frame의 소스로 이동.
  • e : 해당 스택 frame에서 expression을 evaluate
  • i : 해당 스택 frame에서 expression을 inspect

참고 자료:
http://common-lisp.net/project/slime/doc/slime.pdf
http://common-lisp.net/movies/slime.mov

Common Lisp 공부하기

예전에 Paul Graham의 On Lisp로 공부를 시작했었는데, 처음 보기에는 좀 어려운 책인거 같네요.

처음 Lisp 배우기에는 Pratical Common Lisp가 쉬운거 같습니다. 이해하기 쉽게 잘 썼고, 예제 중심으로 잘 설명이 되어 있네요. 이 책을 보고 On Lisp와 Common Lisp The Language(2nd Ed.)을 참고하면서 프로그래밍에 익숙해지면 좋을 듯 합니다. 세 책 모두 웹에서 구할수 있습니다 ^^.

기타 웹사이트 & 자료

윈도우즈에서 Common Lisp 개발 환경 갖추기

사용 소프트웨어: Emacs, CLISP, SLIME, HyperSpec

1. Emacs: 강력한 에디터.
Nqmacs 버전으로 Emacs 22.1이 될 개발버전을 컴파일한 Win32 배포본을 설치합니다.
http://sourceforge.net/project/showfiles.php?group_id=92168 에서
emacs-22.0.50.1-20050626-w32.zip를 다운로드 하여 적당한 디렉토리에 압축풀면 됩니다.
저는 C:\Program Files\emacs에 설치했습니다.
실행은 bin 디렉토리 밑에 runemacs를 실행하면 되고, 필요할 경우 바탕화면이나 시작 메뉴에 바로가기를 만들어주면 됩니다.

2. Common LISP: Emacs는 LISP로 짜여졌지만, Common LISP(이하 CL)를 사용하기 위해서는 따로 CL을 설치해야합니다. 공개 CL 중에 CLISP, SBCL을 많이 쓰는거 같은데, 여기서는 CLISP를 설치합니다.
https://sourceforge.net/project/showfiles.php?group_id=1355
에서
clisp-2.41-win32-mingw-without-readline.zip를 다운로드 하여 C:\Program Files에 압축을 풀었으며, 설치는 따로 필요없고 Emacs 설정에서 LISP 프로그램만 설정해주면 됩니다. 아래 .emacs에 대해서 설명 참조하세요.

3. SLIME: Emacs 내에서 CL 개발 환경을 만들어주는 플러그인. CLISP, SBCL등 대부분의 CL을 지원합니다.
자주 업데이트 되기 때문에 CVS 버전을 사용할 것을 권장하고 있습니다. 사용중에도 안되는게 있으면 CVS업데이트치라고 하더라고요.
http://common-lisp.net/project/slime/ 에서 설치 관련 정보를 찾을수 있습니다.

CVSROOT는  :pserver:anonymous@common-lisp.net:/project/slime/cvsroot
암호는 anonymous
모듈은 slime

emacs/site-lisp에서 체크아웃하면 됩니다. 저는 TortoiseCVS를 사용하여 체크아웃했습니다.

4. HyperSpec: Common Lisp HyperSpec (CLHS)는 CL 프로그램을 작성하면서 API를 조회할수 있는 HTML 문서입니다. clisp가 설치된 doc 디렉토리 밑에 설치하면 됩니다.
http://www.lispworks.com/documentation/HyperSpec/ 에서 밑에 보시면 download가 있습니다. tar.gz 파일인데 받아서 적당히 풀어주면 됩니다. 디렉토리 구조는 아래처럼 되면 됩니다.

clisp-2.41
  doc
   HyperSpec
       Body
       Data
       Front
       Graphics
       Issues

일단 이렇게 하면 설치는 끝났고 설정만 남았습니다. 설정은 c:\.emacs 파일을 만들어주면 됩니다.

제 .emacs 파일을 공개합니다 🙂 C:\.emacs 에 저장해주면 됩니다.

먼저 한글 관련 설정 (전 세벌식 사용자!):

;; 한글환경 설정
(set-language-environment “UTF-8”)
(setq default-input-method “korean-hangul3”)
(set-input-method “korean-hangul3”)
(prefer-coding-system ‘utf-8-dos)
(utf-translate-cjk-load-tables)

;; 글로벌 폰트락 설정
(global-font-lock-mode 1 t)

;; 한영전환 shift-space로 하기
(global-set-key [?\S- ] ‘toggle-input-method)

shift-space로 한영 전환하면 한글조합하는게 이맥스창 내에서 보이고, 윈도우즈 한/영키를 이용하면 조합할때 다른곳에 보이기 때문에 불편합니다.

리스프 설정:

;; inferior lisp
(setq inferior-lisp-program “c:/Progra~1/clisp-2.41/base/lisp.exe -M c:/Progra~1/clisp-2.41/base/lispinit.mem”
     lisp-indent-function ‘common-lisp-indent-function
     slime-complete-symbol-function ‘slime-fuzzy-complete-symbol
     slime-startup-animation nil)

;; slime
(add-to-list ‘load-path “c:/Progra~1/emacs/site-lisp/slime”)
(require ‘slime)
(slime-setup)

(setq common-lisp-hyperspec-root “c:/Progra~1/clisp-2.41/doc/HyperSpec/”)
;(setq common-lisp-hyperspec-root “http://www.lispworks.com/documentation/HyperSpec/“)

inferior-lisp라고 되어있는건 emacs lisp가 더 좋다는 의미에서 나온게 아닐까 생각이 드네요. 지금 찾아보니 emacs 밑에 붙는다고 해서 inferior인거 같네요… hyperspec은 LISP 온라인 문서입니다. LISP 배우실려면 로컬에 설치하는것이 좋죠.

기타 설정:

;(setq visible-bell t)
;(setq sound-alist ‘(t 1))
;(setq bell-volume 10)

(global-set-key “%” ‘match-paren)
        
(defun match-paren (arg)
  “Go to the matching paren if on a paren; otherwise insert %.”
  (interactive “p”)
  (cond ((looking-at “\\s\(“) (forward-list 1) (backward-char 1))
((looking-at “\\s\)”) (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))

(setq make-backup-files t)

앞에 세줄은 오류날때 소리나는거 조절할수있는데, 지금은 주석처리되어 있네요. vi에서 처럼 %로 괄호간 이동할수 기능이 구현되어 있습니다. 커서가 괄호위에 있을때만 동작합니다.

.emacs 파일에 더 내용이 있긴 한데, 나머지는 사용하면서 자동으로 Emacs에서 추가해준 설정 내용이라 공개 안합니다.

그리고 Slime 시작할때 약간 오류가 나는데 slime.el 파일을 약간 바꿔줘야합니다. CVS에 따라서 라인은 약간 다를수 있지만 현재는 1890번줄에서

‘(iso-latin-1-unix iso-8859-1-unix binary))

       –>
‘(utf-8-unix emacs-mule-unix binary))

위 처럼 바꿔주면 정상적으로 slime이 시작됩니다. 고친 방법이 정상적인 방법인지는 저도 모르지만, 아직까진 문제없이 잘 돌리고 있습니다.

그럼 모든 설치가 완료되었으니 runemacs로 Emacs를 실행하고 “M-x slime” 하면 REPL이 뜨고 LISP를 바로 사용할수 있습니다. lisp 파일 편집중 C-c C-c로 현재 위치의 S-exp을 LISP로 보낼수 있으며, C-x C-e로 커서 바로 이전 S-exp를 부분적으로 실행해 볼수 있습니다. 편집중 C-c C-z로 REPL로 다시 갈수 있습니다. SLIME 기능이 많기 때문에 좀더 공부해서 다음에 다시 설명하겠습니다.^^