책: Practical Common Lisp

cinsk의 이미지

글쓴이는 학교에서 LISP을 배우고, 개인적으로 GNU Emacs에서 쓰이는 elisp과, guile을 써보려고 Scheme을 배우기는 했지만, 잘 쓰지는 못합니다. 여러 책을 보기는 했지만, LISP에 대한 막연한 동경?만 하는 상태입니다. 반면에, python은, 따로 책을 보지 않고, 단순히 python.org에서 제공하는 tutorial만 보고도 지금까지 잘 쓰고 있습니다. 물론 python 전문가냐고 물으신다면 별로 할 말은 없지만, 그래도 지금까지 (현업에서) python을 여러 곳에서 잘 활용하고 있습니다. (물론 python이 LISP에 비해 아주 간단한? 언어이기 때문이기도 합니다)

왜 LISP을 몇 년간 마음만 먹고, 여러 책을 보면서도 잘 쓰지 못할까요? 최근에 이런 생각이 들어서 나름대로 글로 써 봅니다.

대부분 LISP 책들은, LISP의 데이터 구조를 설명하고, LISP의 control structure (if, cond, while, loop 등)을 설명하고, lambda, 그리고 마지막으로 macro를 다루는 것으로 설명을 마치게 됩니다. 이런 방식이 나쁘다는 것은 아닙니다. LISP 자체가 Algol, C, C++, python 등과 같은 언어와 현저하게 다르다 보니, 어느 정도 개념만 이해하는 데에도 상당한 노력이 필요하기 때문입니다.

하지만, 한 언어를 배우고 나서, 이 언어를 잘 활용하기 위해서, 언어의 구조나, 이론만 필요한 것은 아닙니다. 직접 언어를 디자인하거나, AI를 배우는 목적이 아닌 이상, 대부분 개발자가 하는 일은 파일 입출력, network, database 등의 작업인데, 정작 LISP 책에서는 이러한 부분을 다루지 않습니다. 논쟁의 여지가 있는 부분이지만, 사실 LISP의 경우, C 언어와 마찬가지로 표준이 존재하긴 하지만, OS와 인터페이스하는 부분에 대해서는 C 언어처럼 표준이 정의하는 라이브러리가 별로 없습니다. 대신 implementation에 따라서 확장 패키지 형태로 제공합니다. 따라서 LISP의 원리와 개념 등을 설명하는데 치중하는 것이 일반적인 LISP을 설명하는 책의 특징입니다.

따라서 직접 소스를 보고, 라이브러리 reference를 보고 상당한 많은 시간을 투자하지 않고, 단순히 책만 읽어서 LISP을 바로 활용할 수 있는 것은 (다른 언어에 비해서) 꽤 힘이 듭니다.

서론이 길었는데, 이런 제 생각을 뒤집는 책이 나와서 소개하려고 합니다.



Practical Common Lisp, Peter Seibel, Apress

이 책은, 제목에 나와 있는 것처럼, 기존 LISP 책과는 달리, 실제 LISP을 어떻게 활용하는가에 대해 다룬 책입니다. 기존에 LISP을 어느 정도 이해하고 있는 분이라면 이 책을 보는 순간, 막혔던 곳이 뻥~ 뚫리는 듯한 느낌을 받으실 겁니다.

LISP은 괄호만 잔뜩 써야 하는 학문을 위한? 언어이다. LISP은 배워도 써 먹을 곳이 없다. 이러한 생각을 가지신 분이라면 꼭 읽어 보기를 추천합니다. 특히 이 책은 online에서 무료로 볼 수 있으므로, 저자(Peter Seibel)와 출판사인 Apress에 감사하는 마음을 가지고 바로 읽어 볼 수 있습니다. http://gigamonkeys.com/book/

다만, 이 책은 LISP 초보를 위한 책은 아닙니다. 제가 아직 다 읽어본 상태는 아니지만, 어느 정도 LISP을 알고 있는 분이어야, 이 책을 읽어볼 수가 있을 것 같습니다. (예를 들어 lambda를 어느 정도 이해하고, 간단한 macro는 만들 줄 아는 분) 큰 뜻을 품고? LISP을 배웠지만, 죽은 지식으로만 가지고 계신 분들에게는 강력하게? 추천합니다.

Practical Common Lisp - why did we publish this book?도 읽어 보시길 바랍니다.

여담으로, LISP에 대해 관심을 별로 두지 않은 분들이라면, 현재 Yahoo shopping mall의 전신이었던 Viaweb 쇼핑몰이 LISP으로 작성되었다는 것을 아시는 분이 많지 않을 거라고 생각합니다. 바로 앞, Wikipedia link에 가시면 Reference 란에 있는 여러 글들도 한 번 읽어보시길 바랍니다.

댓글

cinsk의 이미지

한마디 더, 이런 말은 안하는게 더 좋을 것이라고 생각하지만.. ^^

글쓴이는 고3 때 처음으로 C 언어를 배웠습니다. 그 때에는 포인터를 제대로 이해하고, linked list 코드를 능숙하게? 작성하는데에 약 20여일이 걸렸습니다. 매우 고생했죠. 그러나 그 이후로 C 언어를 어느 정도 이해하고 나서, 다른 언어를 배울 때 어려움을 느낀 적이 별로 없었습니다. 정확히 말해, 다른 언어에 관한 책이나 tutorial을 읽을 때, 무슨 말인지 몰라서 다시 읽는 경우는 없었습니다. (예: assembly, C++, python, makefile, bash, m4, awk, sql, 등) 물론 기억이 안나서 다시 읽는 경우는 많았습니다.

한데, 유일하게? 언어 관련 책을 보면서 이해가 되지 않아서 반복해서 읽기를 여러번 했던 책이 있는데, 바로 LISP과 (LISP의 한 계열, 간한한? 버전격인) Scheme에 관한 책입니다. 정확히 말하면 이 두 언어가 지원하는 continuation이란 개념 덕택이죠. 덕분에 예전에 C 언어에서 포인터를 처음 배웠을 때가 생각나더군요.

뭐.. 고백하자면 LISP의 매크로 기능도 100% 이해가 잘 안되어 고생했긴 합니다.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

M.W.Park의 이미지

더불어,
Common Lisp의 기초부터 공부하고 싶은 분에게는 Common Lisp: A Gentle Introduction to Symbolic Computation을 추천하고 싶고요.

Viaweb 이야기는 Paul Graham의 Hackers & Painters(번역판: 해커와 화가)에 비교적 자세히 나옵니다.

문제를 푸는 다른 (멋진) 방법에 관심이 있다면, Common Lisp이나 Scheme 같은 함수형 언어에도 관심을 가져보는 것이 좋을 듯합니다.

ps. 비슷한 글을 지난번에도 썼지만, 정리 및 강조(?) 차원에서 다시 한번 올려봅니다.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

처로의 이미지

폴 그레이엄이 쓴 글을 번역한 것도 있습니다.

평균 뛰어넘기(Beating the Averages)
- 비어웹(Viaweb) 성공 사례
- http://wiki.kldp.org/wiki.php/BeatingTheAverages

인기 있다는 것(Being Popular)
- 좋은 프로그래밍 언어의 조건
- http://wiki.kldp.org/wiki.php/BeingPopular

gurugio의 이미지


제가 C밖에 몰라서 고급 언어를 배워보려고 scheme 책(SICP)을 봤었습니다.

너무 개념이 어려워서 C++ 먼저 배우면 좀 나아지려나 싶어서

C++을 공부하고 있는데 말씀해주신 책들을 알았더라면 좋았을 뻔했네요.

올해말이나 내년에 다시 LISP에 도전해봐야겠습니다.

C++만 해도 저한테는 굉장히 고급언어인데 LISP는 또 얼마나 새로운 세상일지 기대됩니다.

Scheme을 아주 잠깐 맛을 봤지만 정말 놀랍더라구요.

좋은 정보 감사합니다.

C Faqs도 잘 보고 있습니다. 감사합니다.

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.
http://www.asmlove.co.kr
http://blog.naver.com/gurugio

winner의 이미지

C++ 배운다고 나아질 것은 그리 많지는 않을 것 같군요.
아주 쬐금 좋아질 것 같습니다.

gurugio의 이미지


앗.. 그런가요..

C밖에 해본적이 없는 저로서는 C++도 굉장히 추상적으로 느껴지는데

LISP는 그럼 저 먼 우주에 있는 것이었던 것이었던 것이었던가요.. ;-)

----
세상을 바꾸는 것은 단 한 사람. 오직 하나님의 사람뿐이다.
http://www.asmlove.co.kr
http://blog.naver.com/gurugio

M.W.Park의 이미지

저 먼 우주에 있는 Lisp에 관한 글... ^^;

http://www.flownet.com/gat/jpl-lisp.html

인공 위성을 REPL을 이용해서 디버깅하는 내용이 있었던 것으로 기억합니다.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

M.W.Park의 이미지

방금 생각난, 어제 깜박한 자료
저자인 Peter Seibel의 google에서의 Common Lisp 강의 동영상입니다.
침을 튀기며(?) Lisp을 찬양하고 있죠. ^^;

참고로, Peter Seibel은 second generation lisp programmer입니다.
(그의 아버지가 lisp을 이용해서 망해가던 프로젝트를 살린 적이 있다는군요.)

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

appler의 이미지

역시 모든 언어는 파생되어 지는거군요...ㅎㅎ-_-;;

좋은 정보 감사!!!

또 다시 뜬눈으로 밤을 지새야 겠군요..ㅠ.ㅠ


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.


laziness, impatience, hubris

不恥下問 - 진정으로 대화를 원하면 겸손하게 모르는 것은 모른다고 말하는 용기가 필요하다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.