머리말
어떤 점이 리스프를 그토록 멋지고 특이하게 만드는가?
리스프가 그렇게 좋다면 왜 더 많은 사람이 쓰지 않을까?
리스프는 어디에서 왔는가?
리스프의 힘은 어디에서 왔는가?
SECTION I 리스프는 힘이다
1 리스프 시작하기
리스프 변종
두 리스프 이야기
앞날이 기대되는 리스프
스크립트 언어로 쓰이는 리스프
안시 커먼 리스프
CLISP로 시작하기
CLISP 설치하기
CLISP 실행하기
이 장에서 배운 것
2 첫 리스프 프로그램 만들기
내 숫자를 맞춰봐! 게임
리스프에서 전역변수 선언하기
big과 small 변수 선언하기
전역변수를 정의하는 다른 함수
리스프의 기본 수칙
리스프에서 전역함수 정의하기
guess-my-number 함수 정의하기
smaller와 bigger 함수 정의하기
start-over 함수 정의하기
리스프에서 지역변수 정의하기
리스프에서 지역함수 정의하기
이 장에서 배운 것
3 리스프 문법으로의 여행
문법과 의미
리스프 문법의 기초
심볼
숫자
문자열
리스프는 코드와 데이터를 어떻게 구분하는가
코드 모드
데이터 모드
리스트
콘셀
리스트 함수
중첩 리스트
이 장에서 배운 것
SECTION II 리스프는 대칭이다
4 조건에 따라 결정하기
nil과 ()의 대칭
비었다는 것은 곧 False와 같다
()의 네 가지 가면
조건문: if와 그 밖에 것
한 걸음 나아가 if 이해하기
if를 넘어서: 대안이 되는 when과 unless
그 자체가 전부인 명령어: cond
case로 분기하기
조건 절에서 쓰는 요령
숨은 조건 and와 or 사용하기
참과 함께 다른 값도 반환하는 함수 사용하기
비교하기: eq와 equal, 그리고 다른 것
이 장에서 배운 것
5 텍스트 게임 엔진 만들기
마법사의 어드벤처 게임
게임 세계
기본 요구사항
관련 풍경 묘사하기
장소 묘사하기
경로 묘사하기
유사인용 동작 원리
한 번에 여러 경로 정의하기
특정 장소의 물건 설명하기
눈에 보이는 물건 나열하기
눈에 보이는 물건 묘사하기
전부 출력하기
게임 세계 둘러보기
물건 집기
보관함 확인하기
이 장에서 배운 것
6 리스프에서의 상호 작용: 입력과 출력
글자의 출력과 입력
화면에 출력하기
사용자에게 Hello라고 말하기
print와 read부터 시작하기
사람의 방식으로 읽고 출력하기
리스프에서 코드와 데이터의 대칭
게임 엔진에 직접 만든 인터페이스 추가하기
직접 만드는 REPL
read 함수 직접 작성하기
game-eval 함수 작성하기
game-print 함수 작성하기
화려해진 새 게임 인터페이스 시험하기
read와 eval의 위험성
이 장에서 배운 것
65 람다: 한 장을 차지할 만큼 중요한 함수
람다가 하는 일
람다가 왜 그토록 중요한가
이 장에서 배운 것
7 기본 리스트 뛰어넘기
이상한 리스트
점 리스트
짝
원형 리스트
연관 리스트
복잡한 데이터 처리하기
트리형 데이터 표현하기
그래프 표현하기
그래프 생성하기
DOT 정보 생성하기
노드 식별자 변환하기
그래픽 노드에 이름표 추가하기
노드의 DOT 정보 생성하기
DOT 파일을 그림으로 바꾸기
그래프를 그림으로 만들기
무향 그래프 생성하기
이 장에서 배운 것
8 예전의 웜퍼스는 잊어라
대도 웜퍼스 게임
"배배 꼬인 도시"의 에지 정의하기
무작위로 에지 생성하기
loop 명령어로 반복문 만들기
섬으로 고립되는 것 방지하기
"배배 꼬인 도시"의 마지막 에지 만들기
"배배 꼬인 도시"의 노드 생성하기
대도둑 웜퍼스 게임 초기화하기
도시 지도 그리기
부분적인 데이터로 도시 그리기
도시 걸어다니기
웜퍼스를 사냥하자!
이 장에서 배운 것
9 고급 데이터 타입과 제너릭 프로그래밍
배열
배열 사용하기
제너릭 할당문 사용하기
배열 대 리스트
해시 테이블
해시 테이블 사용하기
여러 개의 값 반환하기
해시 테이블의 성능
해시 테이블로 더 빨라진 "대도둑 웜퍼스" 만들기
커먼 리스프의 스트럭처
스트럭처로 작업하기
스트럭처를 언제 써야 하는가
포괄적으로 데이터 다루기
차례로 나열된 값 다루기
타입 단정 함수로 제너릭 함수 직접 작성하기
오크 대전 게임
플레이어 전역변수와 몬스터 전역변수
주요 게임 함수
플레이어 관리 함수
플레이어 공격에 대한 헬퍼 함수
몬스터 관리 함수
몬스터
대전을 벌이자!
이 장에서 배운 것
SECTION III 리스프는 해킹이다
LOOP와 FORMAT: 리스프의 취약한 부분
10 LOOP 명령어로 반복문 짜기
LOOP 매크로
LOOP에 관련된 몇 가지 기법
LOOP에서 궁금했던 모든 것
LOOP를 써서 진화하자!
게임 세계 속 식물의 성장
동물 생성하기
게임 세계의 하루
게임 세계 그리기
사용자 인터페이스 만들기
진화의 과정을 지켜보자!
진화에 대해 설명하기
이 장에서 배운 것
11 FORMAT 함수로 글자 출력하기
FORMAT 함수 해부하기
목적지에 대한 매개변수
제어 문자열 매개변수
값에 대한 매개변수
리스프 값을 출력하기 위한 제어 부분
숫자의 출력 형식에 대한 제어 부분
정수형 숫자를 출력하는 제어 부분
실수형 숫자를 출력하는 제어 부분
여러 줄의 결과값 출력하기
출력 결과의 자리 맞추기
제어 부분을 사용하여 리스트 순회하기
데이터 테이블을 만드는 최고의 포맷 기법
로봇을 공격하라!
이 장에서 배운 것
12 스트림으로 작업하기
스트림의 종류
스트림의 종류
스트림의 방향
파일로 작업하기
소켓으로 작업하기
소켓 주소
소켓 연결
소켓을 통해 메시지 보내기
자원 반환하기
문자열 스트림: 괴짜 타입
스트림을 함수로 보내기
긴 문자열로 작업하기
읽기와 디버깅
이 장에서 배운 것
13 웹 서버를 만들어 보자!
커먼 리스프에서 오류 처리하기
예외 상황 만들기
사용자 예외 상황 만들기
특정 상황 가로채기
예기치 못한 상황에서 자원 보호하기
맨손으로 웹 서버 만들기
웹 서버 동작 원리
요청의 매개변수
요청의 헤더 해석하기
문자열 스트림으로 get-header 함수 테스트하기
요청의 본문 해석하기
마무리 단계: serve 함수
동적 웹 사이트 만들기
요청 처리기 테스트하기
웹 사이트 열기
이 장에서 배운 것
함수형 프로그래밍은 아름다워
SECTION IV 리스프는 과학이다
14 함수형 프로그래밍으로 리스프의 수준 높이기
함수형 프로그래밍은 무엇인가?
함수형 스타일로 작성된 코드 파헤치기
고차 프로그래밍
절차형 코드와의 코드 구성
함수형 스타일 사용하기
고차 프로그래밍으로 구제하기
함수형 프로그래밍은 왜 안 되는가
함수형 프로그래밍이 왜 멋진가
함수형 프로그래밍은 버그를 줄인다
함수형 프로그램은 더 작다
함수형 코드는 더 우아하다
이 장에서 배운 것
15 함수형 스타일로 작성된 "운명의 주사위" 게임
운명의 주사위 게임 규칙
운명의 주사위 게임 예
운명의 주사위 게임 버전 1 구현하기
전역변수 선언하기
게임판 구현하기
운명의 주사위 게임 규칙 분리하기
게임 트리 생성하기
차례 넘기기
공격 이동 계산하기
인접 영역 찾기
공격
병력 충원하기
새로운 game-tree 함수 사용하기
다른 사람과 맞붙기
지능을 갖춘 적 만들기
미니맥스 알고리즘
미니맥스 알고리즘을 실제 코드로 구현하기
인공지능 플레이어와 함께 하는 게임 반복문 만들기
사람 대 컴퓨터 게임하기
운명의 주사위 게임 속도 개선하기
클로저
메모이제이션
꼬리 호출 최적화
3×3 크기의 판에서 하는 게임의 예
이 장에서 배운 것
16 리스프 매크로의 마법
간단한 리스프 매크로
매크로 확장
매크로는 어떻게 변환되는가
단순한 매크로 사용하기
복잡한 매크로
리스트를 나누는 매크로
매크로 내 반복 실행 막기
변수 충돌 방지하기
재귀 매크로
매크로: 위험성과 그 대안
이 장에서 배운 것
17 특정 도메인 언어
도메인이란 무엇인가?
SVG 파일 작성하기
tag 매크로로 XML/HTML 생성하기
SVG용 매크로와 함수 만들기
더 복잡한 SVG 예제 만들기
마법사의 모험 게임을 위한 사용자 명령어 만들기
새 게임 명령어 직접 만들기
완성된 마법사의 모험 게임하기
이 장에서 배운 것
18 지연 프로그래밍
리스프에 지연 평가 추가하기
lazy와 force 명령 만들기
지연 리스트 라이브러리 만들기
일반 리스트와 지연 리스트 사이의 변환
지연 리스트에 대해 매핑하고 검색하기
운명의 주사위 게임 버전 2 구현하기
더 큰 게임판에서 인공지능 플레이어 작동시키기
게임 트리 다듬기
휴리스틱 적용하기
큰 차이로 이기는가 vs 작은 차이로 이기는가
알파-베타 프루닝
이 장에서 배운 것
19 그래픽을 입한 웹 기반의 운명적 주사위 게임
SVG 포맷으로 게임판 그리기
주사위 그리기
육각판 그리기
게임판 그리기
웹 서버 인터페이스 만들기
요청 처리기 작성하기
게임 웹 서버의 제약 사항
새로운 게임 초기화하기
승자 발표
사람 플레이어 처리하기
컴퓨터 플레이어 처리하기
HTML 내에서 SVG 게임판 그리기
운명의 주사위 버전 3 플레이하기
이 장에서 배운 것
20 운명의 주사위 게임을 더 재미있게
플레이어 수 늘리기
주사위 굴리기
기회 노드 만들기
실제로 주사위 굴리기
엔진에서 주사위 굴리기 코드 호출하기
인공지능 개선하기
운명의 주사위 충원 규칙 개선하기
결론
에필로그
찾아보기