'The Roots of Lisp'에 해당되는 글 2건
- 2009/05/16 [2] 리스프의 근원(The Roots of Lisp): 7개의 원시 연산자 (6)
- 2009/05/10 [1] 리스프의 근원(The Roots of Lisp) (4)
2번째 글인 7개의 원시 연산자(Seven Primitive Operators)란 글을 올립니다. 원문은 리스프의 근원(The Roots of Lisp) 에 있는 "Complete Article (Postscript)
리스프(Lisp)에 관심있는 분들에게 많은 도움이 되었으면 좋겠습니다.
1. 7개의 원시 연산자(Seven Primitive Operators)
시작하려면, 우리는 표현식(expression)을 알아야 한다. 표현식은 foo와 같은 문자열(sequence of letters)이거나, 0개 이상의 표현식을 포함한 리스트(list)와 같은 원자(atom)로 구성되어 있으며, 공백문자(white space)와 닫혀진 괄호(parenthese)로 구분되어진다.
여기에 몇가지 표현식이 있다.
foo
()
(foo)
(foo bar)
(a b (c) d)
마지막 표현식은 4개의 요소로 구성된 리스트이며, 3번째 요소는 그 자신이 리스트의 첫번째 요소이다.
산술적으로 1 + 1이란 표현식의 값은 2이다. 유효한 리스프(Lisp) 표현식들 역시 값들을 가진다. 만약 e 라는 표현식이 v라는 값을 산출하였다면, 우리는 이를 e가 v를 반환(e returns v)하였다고 말한다. 우리는 다음 단계에서 여러 종류의 표현식이 어떠한 종류의 반환을 할 수 있은지 정의하고자 한다.
만약 표현식이 리스트이면, 우리는 첫번째 요소를 연산자(operator)라고 부르고 나머지 요소들은 인자(argument)들 이라고 부른다. 우리는 7개의 원시(7개의 公理 내에 있는) 연산자들을 정의할 것이다. 이는 quote, eq, car, cdr, cons와 cond이다.
1. (quote x)는 x를 반환한다. 가독성을 위해서 우리는 (quote x)를 'x와 같이 단축시킬 수 있다. (참고로 quote의 뜻은 인용한다는 의미입니다. 따라서 인용하여 단축시킬 수 있다는 의미입니다.)
> (quote a)
a
> 'a
> (quote (a b c))
(a b c)
필자가 LispWorks 5.1 Personal Edition에서 실행한 결과는 위와 같습니다.
2. (atom x)는 만약 x 값이 원자이거나 비어있는 리스트라면 원자 t를 반환한다. 다른말로 이는 ()를 리턴한다. 리스프에서는 관례적으로 원자 t를 참(truth)을 표기하거나, 비어있는 리스트의 거짓(falsity)을 표기할때 사용한다.
> (atom 'a)
t
> (atom '(a b c))
()
> (atom '())
t
필자가 LispWorks 5.1 Personal Edition에서 실행한 결과는 위와 같습니다.
지금 우리는 quote의 예를 보면서 누군가의 인자(argument) 값을 구하는 연산자를 확인하였다. 리스트에서 인용함으로써 우리는 이것이 값을 구하는(evaluation)것을 막을 수 있다. atom과 같은 연산자로 인자와 같이 주어진 인용되지 않은 리스트는 다음 코드와 같이 수정되어야 한다.
> (atom (atom 'a))
t
인용되었던 리스트는 단순한 리스트와 같이 수정되어졌으며, 이 경우는 두개의 요소를 가지는 리스트에 대한 경우이다.
> (atom '(atom 'a))
()
필자가 LispWorks 5.1 Personal Edition에서 실행한 결과는 위와 같습니다.
이 결과는 우리가 영어에서 인용을 사용하는 방법이다. 캠브리지(Cambridge)는 메사추세츠(Massachusetts)에 있는 마을인데 9만명의 사람들을 포함하고 있다. "Cambridge"라는 단어는 9 문자를 포함하고 있다.
인용은 외국어의 개념중 일부인것 같은데, 왜냐하면 몇몇 다른 언어들은 이와 같은 것들을 가지고 있기 때문이다.
인용은 리스프의 가장 독특한 특징들중에 하나인데, 리스프의 가장 큰 특징은 코드(code)와 자료(data)는 같은 자료 구조(data structure)에서 구성하는 것이며, quote 연산자를 통하여 자료 구조 내에서 구별할 수 있는 방안을 제공해 주어, 리스프의 독특한 자료구조를 quote 연산자로 묶을 수 있다.
3. (eq x y) 는 만약 x의 값과 y의 값이 같은 원자(atom)이거나, 둘다 비어있는 리스트이거나, 그외에 ()인 경우 t를 반환한다.
> (eq 'a 'a)
t
> (eq 'a 'b)
()
> (eq '() '())
t
필자가 LispWorks 5.1 Personal Edition에서 실행한 결과는 위와 같습니다.
4. (car x)는 x의 값이 리스트로 되어 있을 것이라고 예상하여, 첫번째 요소를 반환한다.
> (car '(a b c))
a
5. (cdr x)는 x의 값이 리스트로 되어 있을 것이라고 예상하여, 첫번째 요소 뒤에 있는 모든 남은 요소들을 반환한다.
> (cdr '(a b c))
(b c)
6. (cons x y)는 y의 값이 리스트로 되어 있을 것이라고 예상하며, y 값의 요소들에 x 값을 포함한 리스트를 반환한다.
> (cons 'a '(b c))
(a b c )
> (cons 'a (cons 'b (cons 'c '())))
(a b c)
> (car (cons 'a '(b c)))
a
> (cdr (cons 'a '(b c)))
(b c)
7. (cond (p1 e1) ... (pn en)) 는 다음 것들의 값을 구한다. p 표현식은 하나의 반환값이 t일때까지 순서대로 값을 구한다. t인것이 발견되면, 대응되는 e 표현식에 모든 cond 표현식의 값인것처럼 값을 반환한다.
> (cond ((eq 'a 'b) 'first)
((atom 'a) 'second))
'second
필자가 LispWorks 5.1 Personal Edition에서 실행한 결과는 위와 같습니다.
우리의 7개의 원시 연산자 중 5개는, 인자들이 항상 연산자로 시작되는 표현식을 가지고 실행되어 값이 구해진다. 이러한 형태의 연산자를 우리는 function 형이라고 부를 것이다.
후후~ 제법 쉽지 않은 번역이었습니다. 아~ 군데 군데 빈틈이 보입니다. 의역을 덧붙였지만, 설명을 많이 첨가해야 될 듯합니다.
그래도 참 간결하면서 핵심만 잘 설명해주는 글이라 공부하는게 즐겁습니다.
원자를 정의하고, 인용하고, 이를 바탕으로 리스트의 요소들을 확인하고 열거한다면, 정말 리스트 하나로 모든 프로그래밍이 끝날듯 합니다.
그간 이런 프로그래밍의 묘미를 왜 몰랐을까요~ :-)
제 글을 보시는 분들중에 프로그래밍에 많은 관심을 가지고 계시는 분들이라면 가급적 빨리 리스프(Lisp)를 접해보시길 권해드리고 싶습니다. 혼자 보시기 어려우시면 Lisp을 좋아하는 사람들의 그룹(한국 리스퍼) 에서 함께하시면 더욱 좋을것 같습니다.
감사합니다. ;-)
'Architecture for Software > Lisp' 카테고리의 다른 글
| 예술로 진화하는 프로그래밍 (2) | 2009/08/17 |
|---|---|
| Lisp을 좋아하는 사람들의 첫 모임이 이번 주 금요일에 강남역 근처에서 있습니다. (1) | 2009/08/11 |
| [2] 리스프의 근원(The Roots of Lisp): 7개의 원시 연산자 (6) | 2009/05/16 |
| [1] 리스프의 근원(The Roots of Lisp) (4) | 2009/05/10 |
| Lisp에 관한 좋은 강의와 책을 소개합니다. (10) | 2009/04/14 |
| Lisp에 관한 몇가지 자료에 대한 정리 (0) | 2009/04/13 |
-
-
장선진 jangsunjin 2009/05/17 16:49
안녕하세요~ 싸이먼님 :-)
ㅎㅎㅎ 우선 제 컴터에 리습웍스가 깔려있는 관계로 리습웍스로 테스트해보았습니다.
잘 동작하는것 같구요~ 제가 아직 내공이 부족하여 디버깅 모드 등을 잘 사용하지는 못하지만 내공이 쌓이는데로 설명 올리겠습니다.
ㅎㅎㅎ 싸이먼 님이 있어서 리스빠 생활이 참 즐겁습니다. 멀리만 계시지 않으셨어도 한번 꼭 뵙고 싶은데~ ^^
조만간 화상채팅이라고 한번 해야겠습니다. ;-)
감사합니다~
-
-
-
장선진 jangsunjin 2009/05/22 14:22
안녕하세요~ 박세식님~
급하실것 있나요~ 천천히 하나씩 재미있게 배우시면 되죠~ ^^
저역시 그렇게 하나씩 배워가고 있답니다.
언젠가는 진정한 리스빠(Lisper)가 될 수 있을 것 같습니다. ㅎㅎㅎ
-
-
리스프(Lisp)에 대한 좋은 내용을 담고 있어서 많은 분들과 공유하고자 번역하여 올립니다. 우선 리스프의 근원(The Roots of Lisp) 소개 페이지부터 번역하여 올립니다. 보시면서 번역상의 문제점등이 있다면 언제든지 댓글 부탁드립니다.
이 글의 원문 전체는 Postscript로 작성되어 있으며, 여기(http://view.samurajdata.se/psview.php?id=2311ad79&page=1&size=full)에서 쉽게 확인하실 수 있습니다.
참고로 리스프(Lisp)에 관심있으신 분들은 Lisp을 좋아하는 사람들의 그룹(한국 리스퍼)란 리스프(Lisp) 관련된 그룹이 있으니, 함께 리스프 관련된 정보를 공유하였으면 좋겠습니다.
지금부터 리스프의 근원(The Roots of Lisp)이란 글을 소개 페이지부터 공유합니다. :-)
리스프의 근원(The Roots of Lisp)
(나는 매카시가 발견한 것들을 나 자신에게 정확하게 이해시키고자 이 글을 작성하였다. 리스프 내의 프로그램 원리에 대하여 알고 싶지 않지만, 리스프의 본질을 이해하길 원하는 누군가에게는 반드시 도움이 될 것이다. 이 둘은 리스프의 기원과 리스프의 시맨틱적인 핵심에 대한 의의가 있다. 사실상 이러한 것들은 리스프의 특징적인 기능 중 하나의 핵심이며, 다른 언어들과 달리 리스프가 사투리1들을 가지게 된 이유이다.)
(I wrote this article to help myself understand exactly what McCarthy discovered. You don't need to know this stuff to program in Lisp, but it should be helpful to anyone who wants to understand the essence of Lisp-- both in the sense of its origins and its semantic core. The fact that it has such a core is one of Lisp's distinguishing features, and the reason why, unlike other languages, Lisp has dialects.)
1960년에 존 매카시(John McCarthy)는 놀라운 논문을 발표하였는데, 유클리드 기하학과 같은 것으로 프로그래밍을 하는 것에 대한 것이었다. 그는 사용하기 쉬운 간단한 연산자들과 함수를 위한 표기법이 주어지면, 전체 프로그래밍 언어를 어떻게 구성할 수 있는지 보여주었다. 그는 이 언어를 리스프(Lisp)라고 불렀는데, "리스트 프로세싱(List Processing)"을 의미한다. 이렇게 부른 이유는 그의 핵심 아이디어가 코드와 자료(Data)를 위한 리스트라고 불리우는 간단한 데이터 구조를 사용하는 것이었기 때문이다.
In 1960, John McCarthy published a remarkable paper in which he did for programming something like what Euclid did for geometry. He showed how, given a handful of simple operators and a notation for functions, you can build a whole programming language. He called this language Lisp, for "List Processing," because one of his key ideas was to use a simple data structure called a list for both code and data.
매카시가 발견했던 것을 이해하는 것은 가치있는데, 단순하게 컴퓨터의 역사에 이정표를 이해하는 것이 아니라, 우리 시대의 프로그래밍의 발전 모델을 이해하는 것과 같기 때문이다. 나에게 있어 지금까지 프로그래밍의 일관성있는 발전 모델은 C 모델과 리스프 모델, 이 두개로 정말 명료하게 정리된다. 이 둘은 마치 시작점과 종료점과 같다. 컴퓨터가 더욱 강력해지는 것과 같이, 새로운 언어는 리스프 모델을 향하여 점차 발전하고 있다. 지난 20년 동안 인기있는 새로운 프로그래밍 언어는 C 모델의 컴퓨팅 방안을 가졌지만, 하나씩 리스프 모델에 장점들을 수용하고 있다. 그 예가 동적 타입(런타임 타이핑)과 가비지 컬렉션이다.
It's worth understanding what McCarthy discovered, not just as a landmark in the history of computers, but as a model for what programming is tending to become in our own time. It seems to me that there have been two really clean, consistent models of programming so far: the C model and the Lisp model. These two seem points of high ground, with swampy lowlands between them. As computers have grown more powerful, the new languages being developed have been moving steadily toward the Lisp model. A popular recipe for new programming languages in the past 20 years has been to take the C model of computing and add to it, piecemeal, parts taken from the Lisp model, like runtime typing and garbage collection.
이 글에서 나는 매카시가 발견한 것들을 가능한 가장 쉬운 용어로 설명하려고 노력할 것이다. 이 글의 중요한 점은 단순하게 40년 전에 누군가 찾아낸 흥미로운 이론적인 결과들을 배우는 것이 아니라, 언어(프로그래밍 언어)들이 어디를 향해가고 있는가를 보여주는 것이다. 사실상, 리스프의 특징을 고찰하는 것은 리스프에 있어 드문 일이지만 작성된 이 글을 통하여 확인할 수 있다. 이 글을 통하여 매카시가 고찰한 것이 무었인지 이해하는 것은, 살아 움직이는 커먼 리스프의 코드에 녹아들어간 그의 수학적인 표기법2과 함께, 그의 발자취를 따라가는 것이다.
In this article I'm going to try to explain in the simplest possible terms what McCarthy discovered. The point is not just to learn about an interesting theoretical result someone figured out forty years ago, but to show where languages are heading. The unusual thing about Lisp-- in fact, the defining quality of Lisp-- is that it can be written in itself. To understand what McCarthy meant by this, we're going to retrace his steps, with his mathematical notation translated into running Common Lisp code.
악몽과 같은 4월이 지나갔습니다. 휴~ 죽는줄 알았습니다. ㅎㅎㅎ
개인적으로 4월에 많은 일들이 있었습니다. 이제 조금씩 정리되어 가고 있네요 :-)
최근 다른 무었보다 최근 Lisp에 관심이 많이 가고 있습니다. 워낙 핵심을 잘 요약한 글이라 이 글을 차근 차근히 번역하여 올리겠습니다. 저도 공부 많이 되네요 ;-)
아울러 애매한 부분을 제 나름대로 의역하였는데, 혹시 잘못 번역된 부분이나 애매한 번역이 있다면 댓글 부탁드립니다.
감사합니다.
'Architecture for Software > Lisp' 카테고리의 다른 글
| Lisp을 좋아하는 사람들의 첫 모임이 이번 주 금요일에 강남역 근처에서 있습니다. (1) | 2009/08/11 |
|---|---|
| [2] 리스프의 근원(The Roots of Lisp): 7개의 원시 연산자 (6) | 2009/05/16 |
| [1] 리스프의 근원(The Roots of Lisp) (4) | 2009/05/10 |
| Lisp에 관한 좋은 강의와 책을 소개합니다. (10) | 2009/04/14 |
| Lisp에 관한 몇가지 자료에 대한 정리 (0) | 2009/04/13 |
| Lisp을 시작하시려는 분들에게 :-) (4) | 2009/04/08 |
-
Subject [2] 리스프의 근원(The Roots of Lisp): 7개의 원시 연산자
2009/05/16 21:43
해커와 화가(Hackers & Painters)라는 책으로 유명한 폴 그레이엄(Paul Graham)의 사이트에 있는 리스프의 근원(The Roots of Lisp)이란 글을 공부겸 번역하고 있습니다. 2번째 글인 7개의 원시 연산자(Seven Primitive Operators)란 글을 올립니다. 원문은 리스프의 근원(The Roots of Lisp) 에 있는 "Complete Article (Postscript) "를 참고하시기 바랍니다. 리스프..
-
-
장선진 jangsunjin 2009/05/11 08:55
네~ 그렇더라구요~
생각보다 많은 양은 아니라서 아예 번역하면서 읽기로 하였습니다. 워낙 폴 아저씨가 좋은 내용을 압축해서 잘 정리해서 저도 많이 도움이 될 것 같습니다.
시간나는대로 바로 바로 정리해서 올리겠습니다.
감사합니다. ;-)
-
-
-
장선진 jangsunjin 2009/05/27 08:35
안녕하세요~ 카리만님 :-)
다른 원서도 번역하고 싶은데, 저 혼자 하기에는 너무 큰일이라 Lisp에 관심있는 많은 분들과 함께 하고 싶습니다.
여러모로 Lisp 관련된 한글 자료가 많이 부족한것 같습니다. 조금이나마 일조하도록 노력하겠습니다.
천천히 가더라도 끊임없이 가겠습니다.
감사합니다. :-)
-



