はじめに 第1部 予備知識 1章 LispとScheme 1.1 Lispの起源 1.2 S式と前置記法 1.3 Scheme 1.4 Gauche 2章 Gaucheの特徴 3章 Gaucheの設計思想や誕生の背景 3.1 Perlの影響 3.2 Common Lispの影響 第2部 Gaucheの基礎練習 4章 Gaucheの開発スタイル 4.1 インタラクティブな実行とREPL 4.1.1 リテラル 4.1.2 手続き呼び出し 4.2 Emacs 5章 プログラムの書式 5.1 スクリプト 5.2 マルチバイト文字の利用 5.3 コメント 5.3.1 コメントの使い分けの慣習 5.4 空白 5.5 名前と予約語 5.6 モジュールを使う 5.7 SRFI 5.8 組込みでサポートされるSRFIライブラリ 6章 リスト 6.1 リストのふたつの顔 6.2 リストの基本操作 6.3 リストの走査 6.4 foldの定義 6.5 簡単なリスト処理 6.6 2種類の再帰 7章 手続き 7.1 手続きオブジェクト 7.2 手続きを取る手続き 7.3 ローカル変数 7.4 可変長引数を取る 7.5 可変長引数を渡す 7.6 引数のパターンマッチング 7.7 省略可能引数とキーワード引数 7.8 部分適用 7.9 多値 7.9.1 多値を受け取る 7.9.2 多値を返す 8章 真偽値と条件判断 8.1 述語と等価述語 8.2 等価性 8.2.1 内容が同じ 8.2.2 入れ物が同じ 8.2.3 数値として同じ 8.2.4 その他の等価性 8.2.5 等価述語をとる手続き 8.3 真偽値を扱う手続き 8.3.1 等価述語以外の述語 8.3.2 否定 8.3.3 述語を取る手続き 8.4 条件判断 8.4.1 ifとcond 8.4.2 case 8.4.3 andとor 8.4.4 whenとunless 8.4.5 and-let* 9章 状態の管理 9.1 集合 9.2 連想リスト 9.3 手続きによるパターンの抽象化 9.4 連想リストふたたび 9.5 名前つきlet 9.6 リストの変更と一般化set! 9.7 準クォート 9.8 グラフ 9.9 具象と抽象の往復 10章 テストと例外処理 10.1 gauche.testモジュール 10.1.1 エラーのテスト 10.1.2 比較手続き 10.1.3 まとめてテスト 10.1.4 テストのパラメタライズ 10.2 例外処理 10.2.1 例外の捕捉 10.2.2 例外を発生させる 10.3 テストフレームワークを書いてみる 11章 評価モデル 11.1 置き換えモデル 11.1.1 作用順序評価 11.1.2 副作用 11.2 環境フレームモデル 第3部 実用的なプログラミング 12章 数値 12.1 数の表現 12.2 数値についての述語 12.3 正確数と不正確数 12.4 桁の丸め 12.5 数値の比較 12.6 四則演算 12.7 最大、最小 12.8 超越関数 12.9 平方根、乗数 12.10 文字列変換と数値変換 13章 文字と文字列の処理 13.1 文字 13.2 文字列の基本操作 13.3 文字列の作成 13.3.1 連結して作る 13.3.2 オブジェクトを文字列に変換する 13.3.3 文字列補間 13.3.4 プログラムの出力を文字列として得る 13.4 文字列の操作 13.4.1 リストへの変換 13.4.2 文字コードの変換 13.4.3 文字列の分割と結合 13.4.4 文字列の比較 13.5 文字集合 13.5.1 文字集合についての述語 13.5.2 文字集合の用途 13.5.3 その他の文字集合手続き 13.6 正規表現 14章 入出力 14.1 入力 14.1.1 read 14.1.2 その他の入力手続き 14.2 出力 14.2.1 オブジェクトの外部表現の出力 14.2.2 人が読むための出力 14.3 ポート 14.3.1 ファイルポート 14.3.2 文字列ポート 14.3.3 現在のポート 14.3.4 ポートの操作 14.3.5 その他のポート 15章 テキストの構築 15.1 木を用いたテキストの表現 15.2 text.html-lite 15.3 SXML 15.3.1 *TOP*要素 15.3.2 *PI*要素 15.3.3 XMLルート要素 15.3.4 属性の表現 15.3.5 SXML要素の記述 15.3.6 SXMLからXMLを出力する 15.3.7 SXMLを扱う便利なモジュール 16章 さまざまなデータ構造 16.1 ベクタ 16.1.1 ベクタの作成 16.1.2 アクセスと代入 16.1.3 ユニフォームベクタ 16.2 ハッシュテーブルとツリーマップ 16.2.1 ハッシュテーブルの作成 16.2.2 データの登録と削除 16.2.3 その他のアクセス手続き 16.2.4 ツリーマップ 16.3 ストリーム 17章 総称関数とオブジェクト 17.1 総称関数 17.2 コレクションとシーケンス 17.2.1 コレクション 17.2.2 シーケンス 17.3 メソッド 17.3.1 メソッドの優先度 17.3.2 next-method 17.4 ユーザ定義型（クラスとインスタンス） 17.4.1 クラス定義 17.4.2 スロット定義 17.4.3 インスタンス生成 17.4.4 スロット値の参照と変更 17.4.5 インスタンスの初期化 17.4.6 継承 17.4.7 スロットの保持 17.5 メタオブジェクトプロトコル 17.5.1 メタクラスの作成 17.5.2 インスタンス化のカスタマイズ 17.5.3 メソッド適用のカスタマイズ 18章 構文の拡張 18.1 手続きと構文 18.2 必須構文 18.3 パターンマッチによるマクロ 18.4 マクロの健全性 18.5 マクロの使用例 18.6 R5RSマクロの限界 18.7 伝統的なマクロ 19章 継続 19.1 制御の流れについての2つのモデル 19.2 Schemeによる継続渡しの表現 19.3 さらに継続を渡して 19.4 call/cc 19.5 大域脱出 19.6 break/next名前付きfor-each 19.7 簡易な例外機構 19.8 コルーチン 20章 モジュールシステム 20.1 モジュールの例 20.2 モジュールの作成 20.2.1 インタフェースの定義 20.2.2 本体の定義 20.2.3 provideでファイルを登録 20.3 モジュールの利用 20.4 モジュールの継承 20.5 モジュールのテスト 21章 デバッグ 21.1 基本的な調査 21.2 #?= (debug-print) 21.2.1 リーダ構文の調査 21.2.2 デバッグプリントは末尾呼び出しを破壊する 21.2.3 debug-print-width 21.3 apropos 21.4 d (describe) 21.5 オブジェクトの調査 21.5.1 refとslot-ref 21.5.2 class-of 21.5.3 class-slots 21.5.4 class-direct-supers 21.6 モジュールの調査 21.6.1 all-modules 21.6.2 current-module 21.6.3 find-module 21.6.4 module-exports 21.6.5 reload 21.7 マクロの調査 21.7.1 macroexpand/macroexpand-1 21.7.2 展開される環境と評価が実行される環境 22章 データベース 22.1 コマンドライン版のスケジュールデータベース 22.2 Gaucheで扱えるデータベースの種類 22.3 ファイルに直接read/writeで記録する 22.3.1 ポートに対するread/write 22.3.2 一時ファイルを使ったデータの書き込み 22.3.3 データベースを初期化する 22.3.4 schedule手続きを書く 22.3.5 予定データの構造 22.3.6 予定の表示 22.3.7 予定の一覧表示 22.3.8 予定の検索と表示 22.3.9 予定の登録、削除 22.3.10 この例で割愛した処理 22.4 dbmモジュールを使ったスケジュールデータベース 22.5 dbm.fsdbmモジュール 22.5.1 dbm.fsdbmモジュールを使う 22.5.2 ファイルシステムにデータを保存する 22.5.3 データベースを開く 22.5.4 データベースを閉じる 22.5.5 スケジュールデータベースの初期化 22.5.6 schedule手続き 22.5.7 予定の表示 22.5.8 予定の一覧表示 22.5.9 予定の検索と表示 22.5.10 予定の登録と削除 22.6 データベースアクセスを1箇所にまとめる 22.7 大域変数の代わりにparameterizeを使う 22.7.1 パラメータは0個または1個の引数をとる手続きとして動作する 22.7.2 make-parameter手続きでパラメータを生成する 22.8 大域変数と比較したパラメータの利点 22.8.1 パラメータはスレッドローカル 22.8.2 parameterizeでダイナミックスコープを実現する 22.8.3 ダイナミックスコープはどんなとき便利か? 22.8.4 フィルタ手続やオブザーバ手続きが使える 22.8.5 パラメータとマクロを使ってwith-dbを書く 22.9 DBI/DBDインタフェース 22.10 RDBMを使ったスケジュールデータベース 22.10.1 dbiモジュールの読み込み 22.10.2 データベースへの接続 22.10.3 データベースを閉じる 22.10.4 with-dbをRDBMSを使うように書き直す 22.10.5 SQLの実行 22.10.6 スケジュールデータベースの初期化 22.10.7 schedule手続き 22.10.8 予定の一覧表示 22.10.9 予定の検索 22.10.10 予定の検索と表示 22.10.11 予定の登録、削除 23章 日付と時間 23.1 現在の日付を得る 23.2 <date>型の値を生成す 23.3 ある日付を与えてその月の最初の日を求める 23.4 次の月、前の月を求める 23.5 ユリウス日と改訂ユリウス日を求める 23.6 日数(=日付の差)を計算する 23.7 その月の日数を求める 23.8 ある日付を与えてその日の曜日を得る 23.9 ある日付を与えてその月のカレンダーを生成する 23.9.1 月の最初の日までの曜日を埋める 23.9.2 先頭を埋めた日付のリストを作る 第4部 Webアプリケーションへの応用 24章 GaucheでCGIスクリプトを書いてみる 24.1 SchemeスクリプトをCGIスクリプトとして実行する 24.2 最も簡単なCGIスクリプト 24.3 www.cgiモジュールを利用する 24.3.1 cgi-main手続きでCGIスクリプトを簡単にする 24.3.2 cgi-header手続きでHTTPヘッダ部を出力する 24.3.3 html-doctype手続きでHTML DOCTYPEを出力する 24.3.4 text.html-liteモジュールでHTML要素のリストを構築する 24.3.5 CGIパラメータを受け取る 24.4 www.cgi.test 25章 スケジュール管理アプリケーション 25.1 カレンダーを作ろう 25.2 カレンダーをtable表示してみよう 25.3 CGIスクリプトにして動かしてみよう 25.4 別の月に移動可能にしてみよう 25.5 予定を保存させてみよう 25.6 使い勝手を改良してみよう 25.6.1 予定のある日に色をつける 25.6.2 予定表示と入力の分離 25.6.3 予定の消去 26章 継続渡しによるWebアプリケーション 26.1 簡易HTTPサーバ 26.1.1 ネットワークとソケット 26.1.2 HTTPリクエストの解析 26.1.3 HTTPレスポンスの生成 26.1.4 コンテンツの生成 26.1.5 ここまでのまとめ 26.2 アプリケーションの仕様 26.3 セッションオブジェクトによる状態管理 26.3.1 プレーヤーの移動と表示 26.3.2 Backボタン問題 26.4 継続渡しスタイルによる状態管理 26.4.1 抽象化 26.5 継続渡しスタイルの特徴 26.6 まとめ 27章 Kahuaアプリケーションを書こう 27.1 Kahuaとは？ 27.1.1 継続渡しスタイル（CPS）でのプログラミング 27.1.2 基本データ形式はS式 27.1.3 オブジェクトデータベース 27.1.4 動的でインクリメンタルな開発 27.1.5 汎用アプリケーションサーバ 27.1.6 オープンソース 27.2 Kahuaを準備する 27.2.1 インストール 27.2.2 サイトバンドルの作成 27.2.3 Kahuaを起動する 27.2.4 アプリケーションの雛形を生成する 27.2.5 雛形をインストールして実行する 27.3 Kahuaアプリケーションの構造 27.3.1 アプリケーション名、エントリとURL 27.3.2 define-entryによる名前つきエントリの定義 27.3.3 entry-lambdaと無名エントリ 27.3.4 デフォルトエントリの登録 27.4 スケジュール管理アプリケーションをKahua化する（1）―表示― 27.4.1 高階タグ手続き 27.4.2 ページテンプレート 27.4.4 URLによる日付の移動 27.4.5 名前つきエントリへのリンク 27.5 スケジュール管理アプリケーションをKahua化する（2）―編集と保存― 27.5.1 Kahuaオブジェクトデータベースと永続クラス 27.6 スケジュール管理アプリケーションをKahua化する（3）―全景― 付録A Gaucheインストール A.1 本書執筆時点でのバージョン A.2 動作環境 A.3 簡単な方法 A.4 文字エンコーディングの選択 A.5 ローカルライブラリパス A.6 IPv6サポート A.7 SLIBの場所 A.8 実行時のライブラリパス A.9 インストール先の指定 A.10 最適化オプション A.11 アンインストール 付録B Emacsの設定 付録C Kahuaインストール C.1 準備 C.2 インストール C.3 サンプルを動かす C.4 Emacs環境の整備 付録D GaucheとR6RS 索引 コラム一覧 Schemeのすごい点 GucheはなぜPerlの影響を受けているのか？ “The Right Thing”とGauche 端末の文字コード設定 Gauche自身にコードを生成させる クォートとeval なぜ配列でなく対で並びを表現するのか？ lambdaの由来 for-eachとmapの引数の順序 構文の拡張とマクロ matchによる構文の分解 「Lisp脳」の謎に迫る―Schemeプログラマの発想 共有構造を持つリストの表記 すべて式である ベンチマークを取ってみる リテラルデータの破壊に注意 総称関数であることを確かめる 動的環境 すべてオブジェクトである（もしそれがお望みなら） 詳細なエラー情報を表示したい なぜマクロではなくevalを使うとうまくいかないのか？ CPS変換 call-with-current-continuation モジュールの読み込み対象となるパス syntaxオブジェクト セッション管理のセキュリティ LinuxでのNPTLサポート