레이블이 Tip인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Tip인 게시물을 표시합니다. 모든 게시물 표시

2008년 3월 22일 토요일

프로젝트 만들기

매번 패키지 설정을 하는 것이 귀찮아서 자동으로 폴더와 파일을 생성하는 함수를 짰다.

(make-project 'hello)
=>
./hello/
./hello/src/
./hello/test/
./hello/build-and-test.lisp
./hello/hello.asd
./hello/hello-test.asd
./hello/src/hello.lisp
./hello/test/hello-test.lisp

적당한 테스트와 소스 코드를 추가한 후 build-and-test.lisp 파일을 SLIME으로 로드(ctrl+c ctrl+l)하면 빌드 및 테스트가 이루어지고 결과가 표시된다.

아래 코드를 보면 짤린 것처럼 보이지만 긁어서 붙여보면 제대로 보인다; 후.. 블로거에서 코드 들여쓰기를 제대로 보이게 하려면 pre 태그를 쓰는 수밖에 없는데 이마저도 코드가 길어지면 짤려 보이니, 참 난감하다. 누구 블로거에서 코드 제대로 보이게 하는 방법 아시는 분 메일로 알려주시면 정말 감사하겠습니다. ^^;

(defun make-project (project-name)
(let ((name-string (string-downcase (symbol-name project-name))))
(ensure-directories-exist (make-pathname :directory (list :relative name-string)))
(ensure-directories-exist (make-pathname :directory (list :realtive name-string "src")))
(ensure-directories-exist (make-pathname :directory (list :relative name-string "test")))
(with-open-file (build-and-test (make-pathname :directory (list :relative name-string)
:name "build-and-test"
:type "lisp")
:direction :output :if-exists nil)
(format build-and-test
"(push (make-pathname :directory (pathname-directory *load-truename*)) asdf:*central-registry*)~%(require '~A-test)~%(~A-test:~A-test)~%(format t ~A)~%(quit)"
name-string name-string name-string "\"~%\""))
(with-open-file (asd (make-pathname :directory (list :relative name-string)
:name name-string
:type "asd")
:direction :output :if-exists nil)
(format asd
";;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-~%~%(defpackage #:~A-asd~% (:use :cl :asdf))~%~%(in-package :~A-asd)~%~%(defsystem ~A~% :name \"~A\"~% :depends-on ()~% :components ((:module src :components ((:file \"~A\")))))"
name-string name-string name-string name-string name-string))
(with-open-file (test-asd (make-pathname :directory (list :relative name-string)
:name (concatenate 'string name-string "-test")
:type "asd")
:direction :output :if-exists nil)
(format test-asd
";;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-~%~%(defpackage #:~A-test-asd~% (:use :cl :asdf))~%~%(in-package :~A-test-asd)~%~%(defsystem ~A-test~% :name \"~A-test\"~% :depends-on (\"~A\" :lisp-unit)~% :components ((:module test :components ((:file \"~A-test\")))))"
name-string name-string name-string name-string name-string name-string))
(with-open-file (main (make-pathname :directory (list :relative name-string "src")
:name name-string
:type "lisp")
:direction :output :if-exists nil)
(format main
"(defpackage #:~A~% (:use :cl))"
name-string))
(with-open-file (test-main (make-pathname :directory (list :relative name-string "test")
:name (concatenate 'string name-string "-test")
:type "lisp")
:direction :output :if-exists nil)
(format test-main
"(defpackage #:~A-test~% (:use :cl :~A :lisp-unit)~% (:export #:~A-test))~%~%(in-package :~A-test)~%~%(defun ~A-test ()~% (run-all-tests :~A-test))"
name-string name-string name-string name-string name-string name-string))))

2008년 3월 10일 월요일

MacPorts 사용법

MacPorts는 DarwinPorts의 새 이름으로 리눅스의 apt-get과 비슷하게 각종 소프트웨어의 설치를 쉽게 해 준다. MacPorts 홈페이지에서 dmg 파일을 받아 설치하면 되는데, 설치 후 port 명령이 매뉴얼대로 되지 않는다면, 경로 설정이 안 되어 있어서 그런 것이다. 홈디렉토리(~)에 .profile 파일을 만들어서 다음과 같이 경로를 추가한다.

export PATH=/opt/local/bin:/opt/local/sbin:$PATH

'port search 프로그램이름'(e.x. port search buildbot)과 같이 하면 port를 통해 설치할 수 있는 프로그램들을 찾아볼 수 있다. 원하는 프로그램 이름을 찾으면 'sudo port install buildbot'과 같이 인스톨하면 된다.

Common Lisp 가이드

사실 리습을 처음 공부하려면 막막하다. 어떤 책으로 시작해야 할지, 수 많은 구현 중에 어떤 구현을 사용해야 할지, 쓸만한 라이브러리나 웹 프레임워크는 어떤 게 있는지.. 알기가 어렵다. 국내에 도움을 얻을 만한 책도, 활발한 커뮤니티도 없다. 그래서 내 경험을 바탕으로, 매우 주관적인 가이드를 써 보고자 한다.

1. 구현(Implementation)
리습은 구현이 여러 개다. 언어 자체를 규정하는 Common Lisp ANSI specification이 있고, 그 specification에 맞게 누구나 커먼 리습을 구현할 수 있다. 많은 구현 중에 SBCL을 사용할 것을 추천한다. 오픈 소스이고, 빠르고, 멀티 스레드를 지원한다. 오픈 소스 중 그 다음으로 추천할만한 구현은 OpenMCL(현재는 Clozure CL로 이름을 바꿨다)정도이다.

2. 설치
리눅스, 맥, 윈도우즈 사용자인데 간편한 설치를 원한다면:
LispBox를 다운받아 설치하는 것이 간편한 방법이다. 윈도우즈 사용자일 경우 Clisp 버전을, 리눅스나 맥 사용자일 경우는 SBCL 버전을 다운받는 것을 추천한다. Clisp은 멀티 스레드를 지원하지 않기 때문에 웹 개발 같은 데 사용하기는 어렵지만, 학습 용도로는 아무 문제가 없다.

맥, 윈도우즈 사용자인데 IDE를 사용해 보고 싶다면:
Lispworks Personal Edition이라는 상용 IDE를 몇 가지 제약과 함께 무료로 사용할 수 있다.

맥 사용자인데 간편한 설치와 좀 더 맥 친화적인 환경을 원한다면:
ReadyLisp이 제격이다.

리눅스나 맥 사용자인데 일일이 직접 설치하기를 원한다면:
리습 작업환경은 사실 Emacs + 리습 구현 + SLIME 이라는 세 가지를 설치한 후 연동해 주는 것이다. Emacs와 리습 구현 자체는 apt-get이나 MacPorts를 통해 쉽게 설치할 수 있을 것이고, SLIME은 내려받아 압축을 푼 뒤 별도의 설치 없이 연동만 하면 된다. 설치방법은 리눅스나 맥이나 거의 동일하다. 다음 글들을 참조하면 된다.
http://onlisp.blogspot.com/2007/12/common-lisp-emacs_12.html
http://onlisp.blogspot.com/2008/01/sbcl-thread.html

3. 에디터
Emacs. 사실 vi나 이클립스를 사용하는 방법도 존재하긴 하지만, 리습의 에디터로는 Emacs가 거의 절대적이라고 생각해도 무방하다.

4. 책
속성으로 아주 기본적인 내용만 빠르게 흝고 싶다면:
http://onlisp.blogspot.com/2007/12/2-ansi-common-lisp.html
http://www.cs.gmu.edu/~sean/lisp/LispTutorial.html
http://psg.com/~dlamkins/sl/chapter03.html

사실 위의 내용만 봐서는 리습을 다른 언어와 차별화하는 특성이 어떤 것인지 알기 어렵다. 리습을 제대로 공부해 보고 싶다면 다음의 책들을 추천한다:

ANSI Common Lisp - Paul Graham
간명하고 재미있게 씌어진 책이다. 다만 온라인에 공개되어 있지 않다는 단점이 있다. 구할 수만 있다면 시작하기에 제일 좋은 책이긴 하다. 일부 챕터의 번역이 인터넷에 올라와 있다.

Chapter 1~4
http://xeraph.com/ => Article/프로그래밍 언어

Chapter 2, 10
http://onlisp.blogspot.com/2007/12/2-ansi-common-lisp.html
http://onlisp.blogspot.com/2007/12/10-ansi-common-lisp.html

Practical Common Lisp
매우 친절하고 자세하게 기술되어 있는 책이다. 온라인에 모두 공개되어 있다는 점도 좋다. 현 시점에서는 가장 추천할만한 책이 아닌가 생각된다. 다만, 저자가 뭐든지 늘여쓰는 경향이 있고, 책 분량이 꽤 되기 때문에 보다가 포기할 가능성도 있다.

Successful Lisp
역시 온라인에서 모두 볼 수 있다. 내용이 그리 많지 않아서 금방금방 볼 수 있고, 유용한 팁들도 꽤 있다.

On Lisp
리습이 가진 최고의 장점이라고 할 수 있는 매크로의 모든 것을 다룬 책이다. 링크한 홈페이지에서 무료로 다운받을 수 있다. 리습에 관한 기본적인 내용을 어느 정도 익혔다고 생각될 때 보는 게 좋다.

5. 커뮤니티
공부하다가 모르는 것에 대해 질문을 해야 할 필요가 있다면 구글 그룹이 좋다. Planet Lisp이라는 곳에서 리습에 관련된 글과 뉴스들을 볼 수 있다.

6. 라이브러리
대부분의 리습 라이브러리들은 Cliki라는 곳에서 찾아볼 수 있다. 다음 라이브러리들을 추천한다.
라이브러리들의 쉬운 설치를 위해: asdf
C와 C++ 라이브러리들을 가져다 쓰려면: cffi
테스팅 프레임워크: lisp-unit
웹 프레임워크: weblocks
웹 서버: hunchentoot
Database: CLSQL
정규식: cl-ppcre

7. 커먼 리습 레퍼런스
언어 자체에 대한 레퍼런스를 보고자 한다면 Common Lisp HyperSpec이 좋다(Emacs에서 slime이 로드된 상태일 때 코드 위에서 ctrl+c ctrl+d h 를 누르면 바로 해당 HyperSpec 페이지로 이동한다). 또는 CLTL2를 참고해도 좋다.

유용한 SLIME 명령어들

사실 코드를 읽다가 repl로 돌아가야 할 경우가 많은데, 그럴 때마다 ctrl+x b로 버퍼를 전환하는 건 여간 귀찮은 일이 아니다. 그럴 경우에 slime repl로 돌아가려면:
ctrl+c ctrl+z

slime을 종료하고 재시동 해야 할 때가 있다. slime 종료는:
, quit

lisp 코드를 읽다가 특정 리습 심볼에 대한 common lisp hyperspec을 보고 싶다면:
ctrl+c ctrl+d h

프로그램을 읽는데, 함수나 변수의 정의된 부분을 살펴보고 싶다면:
meta+.
(meta는 보통 alt. 단 해당 정의부분이 탑레벨에 로드되어 있어야 한다. 예를 들어 define-test 라는 매크로의 정의가 lisp-unit 이라는 라이브러리에 되어 있다면 해당 매크로의 정의를 보기 위해서는 (asdf:operate asdf:load-op 'lisp-unit)과 같이 해당 라이브러리가 로드되어 있어야 한다.)

정의부를 살펴보고 다시 원래 코드로 되돌아가려면:
meta+,
(meta+. 의 반대라고 할 수 있다.)

함수 하나를 컴파일하려면:
커서가 함수 위에 있을 때 ctrl+c ctrl+c

파일을 로드하려면:
로드하려는 파일의 버퍼에서 ctrl+c ctrl+l

파일을 컴파일하고 로드하려면:
컴파일하려는 파일의 버퍼에서 ctrl+c ctrl+k

repl에서 약간의 오타 때문에 거의 똑같은 표현식을 다시 치는 것은 귀찮은 일이다. 입력했던 표현식들을 거꾸로 탐색하려면:
meta+p
반대는:
meta+n

슬라임 쪽 버퍼에 있을 때는 tab만 눌러도 자동완성이 되지만 코드 쪽 버퍼에 있을 때는 meta+tab 이 자동완성.

함수의 caller들을 보고 싶다면:
ctrl+c <
함수의 callee들을 보고 싶다면:
ctrl+c >

슬라임 명령어는 아니고 Emacs 명령어지만 적어본다.
Undo:
ctrl+_
Redo:
ctrl+x z

2007년 12월 18일 화요일

Blogger, Indentation, Code Spacing

Blogger에서 새 게시물을 작성하게 되면 HTML 편집 모드와 쓰기 모드가 있는 것을 볼 수 있다. 쓰기 모드에서 프로그램 코드를 붙여넣고 글을 게시하게 되면 모든 들여쓰기를 무시해버리기 때문에 도무지 코드를 읽을 수가 없다. 방법은 아예 처음부터 HTML 편집 모드에서 글을 작성하는 것이다. line breaking 옵션에 체크해두면 HTML 모드에서도 라인 간 공백은 인식하기 때문에 일일이 br 태그를 쓸 필요 없이 그냥 글을 작성하면 되고 코드를 붙여넣을 때만 코드 앞 뒤를 pre 태그로 감싸주면 코드의 들여쓰기가 무시되지 않는다.

우분투(Ubuntu)에서 구글 툴바의 즐겨찾기 문제

우분투에서 구글 툴바를 깔면 "즐겨찾기를 다운로드하고 있습니다"라는 메시지만 보이면서 즐겨찾기가 제대로 표시되지 않는 것을 볼 수 있다. 이 경우에는 상단 메뉴의 '시스템-관리-시냅틱 꾸러미 관리자'를 선택한 후 libstdc++로 검색해서 libstdc++5 설치에 체크한다. 그러면 의존성 관계에 의해 gcc-3.3-base 도 설치할 거냐고 물어보는데 역시 선택한다. 이 두 항목이 체크되면 메뉴의 '적용'을 누른다. 이 둘을 설치한 후 구글 툴바를 다시 설치하면 즐겨찾기가 제대로 보이는 것을 볼 수 있다.

2007년 12월 12일 수요일

퀵타임(QuickTime)으로 ogg 파일 재생하기

LispCast에서 동영상 파일을 받았는데 ogg 파일이다. 퀵타임으로, 무비스트로도, 패럴렐즈에서 곰플레이어로도, 재생이 안 된다. 다행히 퀵타임에서 ogg 파일을 재생할 수 있게 해주는 플러그인을 찾았다. XiphQT dmg 파일을 받아서 더블 클릭한 후 나타나는 XiphQT 파일을 홈폴더의 라이브러리/Components 디렉토리(없으면 만들어주면 된다)에 복사하면 설치 끝이다. 이제 퀵타임으로 ogg 파일 재생이 된다.