内容紹介
LispハッカーPaul Grahamが、Lispの力の源泉であるマクロプログラミングを解説
Lispは近年、強力で実用的なプログラミング言語として見直されている。本書の原書である"On Lisp"は、Lispの強力さの源であるマクロのプログラミングを徹底的に解説する名著である。
本書は、野田開氏が著者Paul Graham氏の許諾を得て訳し、インターネットで公開していた日本語訳をもとに、さらなる推敲を加えて書籍として出版するもの。
このような方におすすめ
Lispに興味があるプログラマ。具体的には、職業プログラマやアマチュアプログラマや理工系の学生のなかでも向上の意欲があり、自己研鑽のためにLispをはじめ関数プログラミングを学ぼうと考えている人。
目次
主要目次
前書き
第1章 拡張可能なプログラミング言語
第2章 関数
第3章 関数プログラミング
第4章 ユーティリティ関数
第5章 返り値としての関数
第6章 表現としての関数
第7章 マクロ
第8章 いつマクロを使うべきか
第9章 変数捕捉
第10章 マクロのその他の落し穴
第11章 古典的なマクロ
第12章 汎変数
第13章 コンパイル時の計算処理
第14章 アナフォリックマクロ
第15章 関数を返すマクロ
第16章 マクロを定義するマクロ
第17章 リードマクロ
第18章 分配
第19章 クエリコンパイラ
第20章 継続
第21章 マルチプロセス
第22章 非決定性
第23章 ATNを使ったパージング
第24章 Prolog
第25章 オブジェクト指向Lisp
付録 パッケージ
後注
訳者後書き
索引
詳細目次
前書き
第1章 拡張可能なプログラミング言語
1.1 進化によるデザイン
1.2 ボトムアッププログラミング
1.3 拡張可能なソフトウェア
1.4 Lispの拡張
1.5 なぜ(またはいつ)Lispか
第2章 関数
2.1 データとしての関数
2.2 関数の定義
2.3 関数を引数にする
2.4 属性としての関数
2.5 スコープ
2.6 クロージャ
2.7 ローカル関数
2.8 末尾再帰
2.9 コンパイル
2.10 リストから作られる関数
第3章 関数プログラミング
3.1 関数型のデザイン
3.2 命令型プログラミングの裏返し
3.3 関数型インタフェース
3.4 インタラクティブプログラミング
第4章 ユーティリティ関数
4.1 ユーティリティの誕生
4.2 抽象化への投資
4.3 リストに対する操作
4.4 検索
4.5 マッピング
4.6 入出力
4.7 シンボルと文字列
4.8 密度
第5章 返り値としての関数
5.1 Common Lispは進化する
5.2 直交性
5.3 関数の値のメモ化
5.4 関数を合成する
5.5 Cdr部での再帰
5.6 部分ツリーでの再帰
5.7 いつ関数を作るべきか
第6章 表現としての関数
6.1 ネットワーク
6.2 ネットワークのコンパイル
6.3 展望
第7章 マクロ
7.1 マクロはどのように動作するか
7.2 バッククォート
7.3 単純なマクロの定義
7.4 マクロ展開の確認
7.5 パラメータリストの分配
7.6 マクロのモデル
7.7 プログラムとしてのマクロ
7.8 マクロのスタイル
7.9 マクロへの依存
7.10 関数からマクロへ
7.11 シンボルマクロ
第8章 いつマクロを使うべきか
8.1 他の手段では不可能なとき
8.2 マクロと関数どちらがよい?
8.3 マクロの応用例
第9章 変数捕捉
9.1 マクロ引数の捕捉
9.2 自由なシンボルの捕捉
9.3 捕捉はいつ起きるのか
9.4 適切な名前によって捕捉を避ける
9.5 事前評価によって捕捉を避ける
9.6 Gensymによって捕捉を避ける
9.7 パッケージによって捕捉を避ける
9.8 その他の名前空間における捕捉
9.9 変数捕捉にこだわる理由
第10章 マクロのその他の落し穴
10.1 評価の回数
10.2 評価の順番
10.3 マクロ展開関数の副作用
10.4 再帰
第11章 古典的なマクロ
11.1 コンテキストの生成
11.2 with-系マクロ
11.3 条件付き評価
11.4 反復
11.5 複数の値にわたる反復
11.6 マクロの必要性
第12章 汎変数
12.1 汎変数という概念
12.2 複数回の評価に関わる問題
12.3 新しいユーティリティ
12.4 さらに複雑なユーティリティ
12.5 インバージョンを定義する
第13章 コンパイル時の計算処理
13.1 新しいユーティリティ
13.2 例:Bezier曲線
13.3 応用
第14章 アナフォリックマクロ
14.1 アナフォリックな変種オペレータ
14.2 失敗
14.3 参照の透明性
第15章 関数を返すマクロ
15.1 関数の構築
15.2 Cdr部での再帰
15.3 部分ツリーでの再帰
15.4 遅延評価
第16章 マクロを定義するマクロ
16.1 省略
16.2 属性
16.3 アナフォリックマクロ
第17章 リードマクロ
17.1 マクロ文字
17.2 マクロ文字のディスパッチング
17.3 デリミタ
17.4 いつ何が起きるのか
第18章 分配
18.1 リストに対する分配
18.2 他の構造
18.3 参照
18.4 マッチング
第19章 クエリコンパイラ
19.1 データベース
19.2 パターンマッチングクエリ
19.3 クエリインタプリタ
19.4 束縛に関する制限
19.5 クエリコンパイラ
第20章 継続
20.1 Schemeの継続
20.2 継続渡しマクロ
20.3 Code-WalkersとCPS変換
第21章 マルチプロセス
21.1 プロセスの抽象化
21.2 実装
21.3 「早い」だけではないプロトタイプ
第22章 非決定性
22.1 概念
22.2 探索
22.3 Schemeでの実装
22.4 Common Lispでの実装
22.5 カット
22.6 真の非決定性
第23章 ATNを使ったパージング
23.1 背景
23.2 形式的な説明
23.3 非決定性
23.4 ATNコンパイラ
23.5 ATNの例
第24章 Prolog
24.1 概念
24.2 インタプリタ
24.3 規則
24.4 非決定性の必要性
24.5 新しい実装
24.6 Prologの機能の追加
24.7 例
24.8 コンパイルという言葉の意味
第25章 オブジェクト指向Lisp
25.1 Plus ca Change――姿かたちは変われども
25.2 素のLispによるオブジェクト
25.3 クラスとインスタンス
25.4 メソッド
25.5 補助メソッドとメソッド結合
25.6 CLOSとLisp
25.7 いつオブジェクトを使うのか
付録 パッケージ
後注
訳者後書き
索引
続きを見る