[フレーム]
Skip to main content

Land of Lisp

[cover photo]
TOPICS
発行年月日
PRINT LENGTH
512
ISBN
978-4-87311-587-0
原書
Land of Lisp
FORMAT
Print PDF
Ebook
4,180円
Ebookを購入する
Print
4,180円
書籍のご注文はオーム社サイト

地球上でもっともパワフルなプログラミング言語であると言われながら、その謎めいたシンタックスやアカデミックな評判の高さなどから敬遠されることもあったLisp。そんなLispの不遇な時代に終わりを告げるのが本書『Land of Lisp』(Lispの国)です。不思議なマンガやout-of-this-worldなゲームの数々とともに、ベテランLisperの著者が、謎多きCommon Lispを伝授。リストの操作、入出力、再帰などの基礎から始めて、さらにマクロや高階プログラミング、ドメイン特化言語などへと話題をすすめながら、Lispのより高度なテクニックについて解説しています。

翻訳者によるサポートページ(http://practical-scheme.net/wiliki/wiliki.cgi/Shiro:LandOfLisp)

目次

謝辞
はじめに
Lispがクールで、そして奇妙なわけ
Lispがそんなにすごいなら、どうしてもっとたくさん使われないのか
Lispはどこから来たのか
Lispの力はどこから来るのか
第I部 LISPは力なり
1章 さあLispを始めてみよう
 1.1 Lispの方言
 二つのLispの物語
 新しいLispたち
 スクリプティングに使われるLisp方言
 ANSI Common Lisp
 1.2 CLISPを始めよう
 CLISPのインストール
 CLISPを起動する
 1.3 この章で学んだこと
2章 はじめてのLispプログラム
 2.1 数当てゲーム
 2.2 Lispでグローバル変数を定義する
 変数smallとbigを定義する
 グローバル変数を定義するもう一つの方法
 2.3 基本的なLispのエチケット
 2.4 グローバル関数を定義する
 guess-my-number関数の定義
 smallerとbigger関数の定義
 start-over関数の定義
 2.5 ローカル変数を定義する
 2.6 ローカル関数の定義
 2.7 本章で学んだこと
3章 Lispの構文の世界を探検する
 3.1 シンタックスとセマンティクス
 3.2 Lispシンタックスの構成要素
 シンボル
 数値
 文字列
 3.3 Lispはコードとデータをどう区別するか
 コードモード
 データモード
 3.4 Lispとリスト
 コンスセル
 リストを扱う関数
 ネストしたリスト
 3.5 本章で学んだこと
第II部 LISPは対称なり
4章 条件と判断
 4.1 nilと()の対称性
 空とは偽なり
 ()の四つの顔
 4.2 条件分岐: Ifとその仲間たち
 ifは一度に一つずつ
 ifを越えて: whenとunless
 万能条件コマンドcond
 caseによる分岐
 4.3 ちょっとした条件式のテクニック
 隠された条件分岐、andとorを使う
 真理以上のものを返す関数
 4.4 比較関数: eq、equal、そしてもっと
 4.5 本章で学んだこと
5章 テキストゲームのエンジンを作る
 5.1 魔法使いのアドベンチャー
 このゲームの世界
 基本的な要求仕様
 連想リストを使って景色を描写する
 情景を描写する
 5.2 通り道を描写する
 準クオートの仕組み
 複数の通り道を一度に描写する
 5.3 特定の場所にあるオブジェクトを描写する
 目に見えるオブジェクトをリストする
 見えるオブジェクトを描写する
 5.4 全てを描写する
 5.5 ゲーム世界を動き回る
 5.6 オブジェクトを手に取る
 5.7 持っているものを調べる
 5.8 本章で学んだこと
6章 世界とのインタフェース: Lispでのデータの読み書き
 6.1 テキストの表示と読み込み
 スクリーンへの表示
 ユーザに挨拶しよう
 printとreadから始める
 人に優しいデータの読み書き
 6.2 Lispにおけるコードとデータの対称性
 6.3 ゲームエンジンに専用のインタフェースを追加する
 専用のREPLの準備
 専用のread関数を書く
 game-eval関数を書く
 game-print関数を書く
 6.4 さあこの素敵なゲームインタフェースを試してみよう
 6.5 readとevalの危険について
 6.6 本章で学んだこと
6.5章 lambda:とても大事な関数なので特別に章を分けて説明しよう
 6.5.1 lambdaがすること
 6.5.2 lambdaがそんなに大事なわけ
 6.5.3 本章で学んだこと
7章 単純なリストの先へ
 7.1 奇妙なリスト
 ドットリスト
 対
 循環リスト
 連想リスト
 7.2 複雑なデータを扱うには
 木構造のデータの可視化
 グラフを可視化する
 7.3 グラフを作る
 DOTの情報を生成する
 DOTファイルを画像にする
 グラフを画像にする
 7.4 無向グラフを作る
 7.5 本章で学んだこと
8章 親父のワンプスとは一味違う
 8.1 グランド・セフト・ワンプス
 8.2 コンジェスチョン・シティのエッジを定義する
 ランダムなエッジの生成
 loopコマンドでループしよう
 孤島を作らない
 コンジェスチョン・シティのためのエッジリストを完成させる
 8.3 コンジェスチョン・シティのノードリストを作る
 8.4 新しいゲームを始めるために、グランド・セフト・ワンプスを初期化する
 8.5 シティのマップを描く
 部分的な知識からシティを描く
 既知の部分だけの地図を描く
 街を歩き回る
 8.6 ワンプスを狩り出せ!
 8.7 本章で学んだこと
9章 より進んだデータ型とジェネリックプログラミング
 9.1 配列
 配列を使う
 ジェネリックなセッター
 配列とリスト
 9.2 ハッシュテーブル
 ハッシュテーブルを使う
 複数の値を返す
 ハッシュテーブルの性能
 グランド・セフト・ワンプスの性能をハッシュテーブルで改善する
 9.3 構造体
 構造体を使う
 構造体をいつ使うか
 9.4 データをジェネリックに扱う
 シーケンスを使う
 型述語を使って自分でジェネリック関数を作る
 9.5 オーク・バトル
 プレーヤーとモンスターのグローバル変数
 ゲームのメイン関数
 プレーヤーを管理する関数
 プレーヤーの攻撃に使う補助関数
 モンスターを管理する関数
 モンスターたち
 戦いだ!
 9.6 本章で学んだこと
第III部 LISPはハックなり
 loopとformat: Lispの怪しげな下町
10章 loopコマンドによるループ
 10.1 loopマクロ
 loopの使用例
 loopマクロの全てを知る
 10.2 loopを使って進化ゲームを作ろう
 マップに草を生やそう
 シミュレーション世界の1日
 世界を描く
 ユーザインタフェースを作る
 進化の様子をみてみよう
 進化の種明かし
 10.3 本章で学んだこと
11章 format関数でテキストを表示する
 11.1 format関数の呼び出し方
 出力先
 制御文字列
 値引数
 11.2 Lispの値を表示する制御シーケンス
 11.3 数値を整形する制御シーケンス
 整数の整形
 浮動小数点数の整形
 11.4 複数行出力
 11.5 テキストを揃える
 11.6 繰り返しの制御シーケンス
 11.7 綺麗な表を作るクレージーな整形トリック
 11.8 ロボットの襲撃!
 11.9 本章で学んだこと
12章 ストリーム
 12.1 ストリームの種類
 リソースの種類による分類
 向きによる分類
 12.2 ファイルの読み書き
 12.3 ソケットを使う
 ソケットアドレス
 コネクション
 ソケット上でメッセージを送る
 遊んだ後はお片付け
 12.4 異端児の文字列ストリーム
 関数にストリームを渡す
 長い文字列を作る
 コードの読みやすさとデバッグ
 12.5 本章で学んだこと
13章 Webサーバを作ろう!
 13.1 Common Lispでのエラー処理
 コンディションを通知する
 自前のコンディションを作る
 コンディションを横取りする
 予想外のコンディションからリソースを保護する
 13.2 ゼロからWebサーバを書く
 Webサーバの仕組み
 リクエストパラメータ
 リクエストヘッダを解析する
 文字列ストリームを使ってget-headerをテストする
 リクエストボディの解析
 最後の仕上げのサーバ関数
 13.3 動的なWebサイトを作る
 リクエストハンドラをテストする
 Webサイトの立ち上げ
 13.4 本章で学んだこと
13.5章 美しき哉 関数型プログラミング
第IV部 LISPは科学なり
14章 関数型プログラミングでLispをレベルアップ
 14.1 関数型プログラミングって何だ?
 14.2 関数型スタイルで書かれたプログラムの分析
 14.3 高階プログラミング
 命令型コードでのコード合成
 関数型スタイルを使う
 高階プログラミングによる救援
 14.4 関数型プログラミングはなぜクレージーか
 14.5 関数型プログラミングはなぜ素晴らしいか
 関数型プログラミングはバグを減らす
 関数型プログラミングは簡潔だ
 関数型プログラミングはエレガントだ
 14.6 本章で学んだこと
15章 ダイス・オブ・ドゥーム:関数型スタイルでゲームを書こう
 15.1 ダイス・オブ・ドゥームのルール
 15.2 ダイス・オブ・ドゥームのゲーム例
 15.3 ダイス・オブ・ドゥームの実装、バージョン1
 いくつかのグローバル変数
 ゲーム盤の表現
 ダイス・オブ・ドゥームのルールをゲームの他の部分から分離する
 ゲームツリーの生成
 相手に手番を渡す
 攻撃の手を計算する
 隣接するマスを見つける
 攻撃
 補給
 game-tree関数を試す
 人間対人間でダイス・オブ・ドゥームをプレイする
 15.4 コンピュータによる対戦相手を作る
 ミニマックスアルゴリズム
 ミニマックスをコードにする
 AIプレーヤーを使うゲームループ
 人間対コンピュータで対戦してみよう
 15.5 ダイス・オブ・ドゥームを高速化する
 クロージャ
 メモ化
 末尾呼び出し最適化
 3x3のゲーム盤でのプレイ例
 15.6 本章で学んだこと
16章 マクロの魔法
 16.1 簡単なLispマクロ
 マクロの展開
 マクロはどんなふうに変換されるか
 簡単なマクロを使ってみる
 16.2 もっと複雑なマクロ
 リストを分割するマクロ
 マクロ中で式が繰り返し実行されるのを防ぐ
 変数捕捉を避ける
 再帰呼び出しマクロ
 16.3 マクロの危険と代替案
 16.4 本章で学んだこと
17章 ドメイン特化言語
 17.1 ドメインとは何か
 17.2 SVGファイルを書き出す
 タグマクロを使ってXMLとHTMLを生成する
 SVG特有のマクロと関数を作る
 もっと複雑なSVG画像を描く
 17.3 魔法使いのアドベンチャーゲームに新たなコマンドを追加する
 ゲームコマンドを直接定義する
 完成した魔法使いのアドベンチャーゲームをプレーしよう
 17.4 本章で学んだこと
18章 遅延プログラミング
 18.1 Lispに遅延評価を足す
 lazyコマンドとforceコマンドの作成
 遅延リストライブラリを作る
 通常のリストと遅延リストとの変換
 遅延リストに対するマッピングと検索
 18.2 ダイス・オブ・ドゥーム、バージョン2
 18.3 大きなゲーム盤でAIを動かす
 ゲーム木の刈り込み
 ヒューリスティクスを適用する
 大きく勝つか小さく勝つか
 アルファ・ベータ法
 18.4 本章で学んだこと
19章 ダイス・オブ・ドゥームに
 グラフィカルなWebインタフェースをつける
 19.1 ゲーム盤をSVGフォーマットで描画する
 サイコロを描く
 マスを描く
 ゲーム盤を描く
 19.2 Webサーバインタフェースを作る
 リクエストハンドラの作成
 このゲームWebサーバの制限
 ゲームを初期化する
 勝者を表示する
 人間のプレーヤーの処理
 コンピュータプレーヤーを処理する
 HTMLの中にSVGゲーム盤を描く
 19.3 ダイス・オブ・ドゥーム、バージョン3をプレーする
 19.4 本章で学んだこと
20章 ダイス・オブ・ドゥームをさらに面白く
 20.1 プレーヤーの数を増やす
 20.2 サイコロを振る
 確率ノードを作る
 サイコロを実際に振る
 ゲームエンジンからサイコロを振るコードを呼び出す
 AIの改良
 20.3 ダイス・オブ・ドゥームの補給ルールの改善
 20.4 終わりに
エピローグ
訳者あとがき
索引

関連書籍

AltStyle によって変換されたページ (->オリジナル) /