『プログラミングGauche』
https://gyazo.com/96f0e715b3be145384b85ad54eb5106a
手にとった動機
だから、頭から徐々に見ていく気はあまりない
非効率かもしれないが、本が分厚すぎるので読んでられない
継続の章にかかれているコードが理解できればそれでいい
1章
2章
3章
Common Lisp Object System
4章
基本文法
みどく
5章
未読
6章
19章
はじめに
第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.1 リーダ構文の調査
21.2.2 デバッグプリントは末尾呼び出しを破壊する
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サポート