More actions
A Gentle Introduction To Symbolic Computation: http://www.cs.cmu.edu/~dst/LispBook/
읽으면서 정리해보자
서문
- 리스프는 인공지능 연구의 주요 언어로 유명하다
- 염두에 둔 독자: 프로그래밍 입문하는 학생 / 심리학자, 언어학자, 컴퓨터 과학자 등 인공지능에 관심 있는 사람들 / 취미로 컴퓨터 하는 사람
- 책의 구성
- 1, 2장: 상자, 화살표 표기로 기초적인 함수, 함수 합성 설명
- 3장: EVAL 표기
- 8장까지는 부수효과 없는 프로그래밍
- 9장: 입출력
- 10장: ordinary variables, generalized variables, destructive sequence operations.
- 11장: 반복(DO, DO*)
- 12장: 구조
- 13장: 배열, 해시테이블, property list
- 14장: 매크로, 컴파일, lexical scoping과 dynamic scoping의 차이
- 간략화
- Common Lisp는 복잡한 언어라 적당히 간략화한 것들이 있다
- 1+와 1-는 이름이 혼란스러워 뺐다
- EQUAL을 주로 사용. EQ, EQL, EQUALP, =는 고급 주제에서 논의
- 잘 알려지지 않은 PUSHNEW 같은 원시형을 사용하느니 함수를 좀 더 풀어쓴 것이 몇 군데 있다
- 가장 고급 주제인 multiple value나 package system은 다루지 않는다
PDF 파일에 목차가 없어 ㅡㅡ
1장. 함수와 데이터
1장 요약
- 산술 함수: +, -, *, /, ABS, SQRT
- 숫자형: 정수(integer), 부동소수점수(floating number), 비율수(ratio)
- 정수로 산술 연산을 하면 결과는 정수 또는 비율수다.
- 3/6 = 1/2 <- 이게 ratio
- 3/6.0 = 0.5
- 심볼: 숫자 이외의 또다른 자료형
- 특수 심볼: T는 참 또는 긍정, NIL은 거짓 또는 부정
- T 또는 NIL을 반환하는 함수는 술어식(predicate)
- 기본적인 내장 함수들
- NUMBERP: 데이터가 숫자형인가?
- SYMBOLP: 데이터가 심볼인가?
- 숫자형 전용 술어식들: ZEROP(영), ODDP(홀수), EVENP(짝수)
- 크기 비교: <. >
- 항등 비교: EQUAL
- 내장 함수들은 원시 함수(primitive function) 또는 그냥 primitive라고 부른다
- 입력에서 1을 더하거나 빼는 1+, 1- 함수가 있지만 이 책에선 쓰지 않겠다. 헷갈림
- 부정: NOT(NIL은 T로, NIL이 아닌 모든 것은 NIL으로)
- 그럼 NOT(NOT(5))는 5가 아니라 T인가?
- 함수의 인자 개수
- ODDP의 인자는 딱 1개, EQUAL은 2개
- +, -, *, /의 인자 개수는 여러 개
- +의 인자가 2, 3, 4면 2랑 3부터 더하고 여기에 4를 더한다
- -, /의 인자가 하나인 경우
- -의 인자가 n이면 결과는 0에서 n 뺀 거
- /의 인자가 n이면 결과는 1에서 n 나눈 거
- 타 언어는 산술 연산이 이항 연산이고 2+3+4는 단순히 (2+3)+4로 처리되는데
- 리스프는 + 자체가 n항 연산이 될 수 있다는 건가???
- 오류: 3이랑 FRED를 더할 수 없고, EQUAL의 인자를 한 개만 넘기면 안 되고, 0으로 나누면 안 되고.
1장 고급 주제
- 리스프의 역사
- 1956년 Dartmouth 대학에서 여름에 열린 인공지능 관련 연구 모임에서 존 매카시가 "list processing"이란 기법을 배웠다
- 1950년대에는 어셈블리어로 프로그래밍을 했지
- "list processing"을 발표한 사람들은 심볼과 리스트를 다루는 보다 추상적인 IPL이란 언어를 만들었다
- 그 문법이 어셈블리어에 가까워서 괴상했다
- 한편 수치적 계산에 특화된 FORTRAN이 개발되고 있었다
- 어셈블리어는 Y = (X + 5) * 10 하려면 LOAD Y, X -> ADD Y, 5 -> MULT Y, 10 라고 써야 하는데
- FORTRAN은 그냥 Y = (X + 5) * 10 이라고 쓰면 된다. 표현식(expression)의 작성이 가능하다는 뜻
- 그 당시에는 이 개념이 혁명이였다더라
- 존 매카시: 나도... 나도 이런 거 만들 거야!
- FORTRAN에 리스트 조작을 위한 특별한 하위루틴들을 추가하면 어떨까?
- IBM의 Herbert Gelerntner와 Carl Gerberich가 이 아이디어를 따와 FLPL을 만듦
- 매카시는 IPL, FORTRAN, FLPL을 토대로 LISP를 설계
- Lisp 1.5는 처음으로 널리 퍼진 리스프 방언
- 1960년대 중반부터 온갖 리스프 방언이 생기기 시작
- MacLisp, Interlisp, Stanford Lisp 1.6, UCI Lisp...
- 모두 Lisp 1.5을 확장한 것. 하지만 서로 호환이 하나도 안 된다
- 1970년대: ALGOL계 언어의 특징들과 리스프의 문법을 결합한 Scheme이 나왔어요
- 그리고 또다시 Scheme의 방언들이 우후죽순 생겨나기 시작했다
- 1980년대: 널리 쓰이는 리스프 방언만 해도 수두룩한데... 뭘 써야 하지?
- 만국공용어를 만들자!!!
- 1984년 Common Lisp 초안 발표
- 학술계에서도 산업계에서도 빠르게 주류로 성장
- 지금은 Common Lisp 때문에 Scheme 빼고 거진 다 죽었지렁
- 많은 프로그래밍 아이디어가 리스프에서 출발할 것
- 인터프리터 함수와 컴파일 함수의 결합
- 함수 재귀 호출
- 소스 수준 추적 & 디버깅
- 문법 지향 편집기
- 오늘날의 리스프는 함수형, 객체지향, 병렬 프로그래밍 연구의 선두 주자
2장은 내일 읽는다