プログラミングGauche

[cover photo]
TOPICS
Programming , Perl
発行年月日
PRINT LENGTH
524
ISBN
978-4-87311-348-7
FORMAT
PDF
Ebook
3,520円
Ebookを購入する

Gauche(ゴーシュ)は、プログラミング言語Schemeの処理系のなかでもきわめて実用的で軽快な処理系です。豊富なライブラリが用意され、スクリプト言語処理系として手軽に扱うことができます。本書は、Schemeの初心者を対象に、Gaucheの基礎からプログラミングの実際までを詳しく解説。Gaucheの開発環境でプログラマがどのように考え、作業していくのかを、順を追って理解できます。本書によって、SchemeやGaucheのコードを読み解く準備ができ、実用的なGaucheプログラミングへの第一歩を踏み出せることでしょう。

目次

はじめに

第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サポート