表紙 -- 前書き -- 目次 -- 第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 マクロ展開関数の副作 |