中古品:
¥2,000 税込
配送料 ¥260 5月29日-30日にお届け(21 時間 58 分以内にご注文の場合)
詳細を見る
中古商品: 良い | 詳細
発売元 堀田書店
コンディション: 中古商品: 良い
コメント: カバーに傷み・汚れ・スレ・ヤケがございます。迅速に発送いたします。
Kindleアプリのロゴ画像

無料のKindleアプリをダウンロードして、スマートフォン、タブレット、またはコンピューターで今すぐKindle本を読むことができます。Kindleデバイスは必要ありません

ウェブ版Kindleなら、お使いのブラウザですぐにお読みいただけます。

携帯電話のカメラを使用する - 以下のコードをスキャンし、Kindleアプリをダウンロードしてください。

KindleアプリをダウンロードするためのQRコード

何か問題が発生しました。後で再度リクエストしてください。

On Lisp: Advanced Techniques for Common Lisp 単行本 – 2007/3/1

4.8 5つ星のうち4.8 15個の評価

LispハッカーPaul Grahamが、Lispの力の源泉であるマクロプログ
ラミングを解説

 Lispは近年、強力で実用的なプログラミング言語として見直されている。本書
の原書である"On
Lisp"は、Lispの強力さの源であるマクロのプログラミングを
徹底的に解説する名著である。
本書は、野田開氏が著者Paul Graham氏の許諾を得て訳し、インターネットで公
開していた日本語訳をもとに、さらなる推敲を加えて書籍として出版するもの。

続きを読む もっと少なく読む

商品の説明

出版社からのコメント

読者の方のご参考のために、Web上にある関連リソースを挙げてお
きます。

著者Paul Graham氏のサイト上のページ(原書PDF, コード, 正誤など)

訳者 野田開氏による翻訳草稿(TeX, PDF, HTML)

出版社のカタログ

抜粋

第1章
拡張可能なプログラミング言語
The Extensible Language
遠くない昔,Lisp は何のためのプログラミング言語かと尋ねれば,多くの人が
「人工知能(AI) 用のプログラミング言語」と答えただろう.実際はLisp とAI
との関係は歴史の偶然にすぎない.Lisp の開発者はJohn McCarthy で,彼は
「人工知能」という言葉の提唱者でもある.彼の学生と同僚たちはプログラムを
Lisp で書いた.それがLisp がAI 用のプログラミング言語と言われ出したきっ
かけだ.このつながりは広く取り上げられ,1980 年代の短いAI ブームの間に大
変なほど繰り返されたので,ほとんど迷信のようになってしまった.
幸運なことに,AI だけがLisp の目的でないとの言葉が広まり始めた.最近のハードウェア
とソフトウェアの進歩のおかげで,Lisp は商業的にも成功し始めた:今では最
高のUnix 系テキストエディタGNU Emacs,業界標準のデスクトップCAD ソフト
Autocad,そして先駆的ハイエンド出版ソフトInterleaf で使われている.これ
らのプログラムでのLisp の使われ方はAI とは何も関係ない.
Lisp がAI 用プログラミング言語でないのなら,いったい何なのか? Lisp をその交友関係から
判断するのでなく,言語そのものを見てみよう.他のプログラミング言語ででき
ないことのうち,Lisp には何ができるか? Lisp の最も特徴的な性質の一つ
は,書こうとしているプログラムに合わせてLisp を仕立てることができる点
だ.LispそのものがLisp プログラムであること,Lisp のプログラムはリストと
して表現でき,リストはLisp のデータ構造だということ.これら2 個の原則が
相俟って,組み込みのものと区別のつかないオペレータをどのユーザもLisp に
追加できることになる.
1.1 進化によるデザイン
Lisp では独自のオペレータを
定義する自由がユーザにあるので,Lisp を必要なプログラミング言語にきっち
り仕立てることができる.ユーザがテキストエディタのプログラムを書いている
のなら,Lisp をテキストエディタを書くための言語に変えることができる.ま
たCAD ソフトのプログラムを書いているのなら,Lisp をCAD ソフトを書くため
の言語に変えることもできる.そしてどんなプログラムを書くかまだ確かでない
なら,Lisp で書いておくのが安全な賭けだ.それがどんな種類のプログラムに
なったとしても,それを書いている間に,Lisp はその種類のプログラムを書く
ためのプログラミング言語に進化していることだろう.
どんなプログラムを書く
かまだ確かでないなら? 人によってはこの文は奇妙に響くだろう.これは(1)
これからやることを注意深く計画し,そして(2) それを実行する,というモデル
とは水と油のように相容れない考え方だ.プログラムのすべき動作を決める前に
プログラムを書くことをLisp が勧めているとすれば,このモデルによれば,
Lisp は単に杜撰な考え方を勧めているにすぎないことになる.
だが,そんなこ
とはない.「計画−実装」方式もダム建設や侵略作戦の決行にはいい方法だった
が,人々の経験によればプログラムを書くのにいい方法だったかどうかは定かで
ない.なぜか? きっと,コンピュータは大変正確だからだ.きっと,プログラ
ムはダムや侵略作戦よりもバリエーションが多いからだ.またはきっと,古い
概念における冗長性に相当するものがソフトウェア開発にないせいで,古い方式
が機能しないことによるのだろう:ダムが30% 余分なコンクリートを使っていて
も,それは誤差として許される範囲内だろう.しかしプログラムが30% 余分な動
作をしていたら,それは間違いだ.
古い方式が失敗に終わるのがなぜかを言うの
は難しいかもしれないが,それが確かに失敗しているのは,誰の目にも明らか
だ.ソフトウェアが期日どおりに完成したことがあるだろうか? 熟練プログラ
マは,どれほど慎重にプログラムの計画を立てても,プログラムを書き始める
と,必ず計画にどこか不完全な点が見つかることを知っている.計画が望みのな
いほどまで間違っていることもある.しかし「計画−実装」方式の犠牲者のほと
んどはその基礎の健全さを疑おうとはしない.代わりに彼らは人間の失敗を責め
る:「もう少しいい展望の下に計画を立ててさえいたら,こんな問題はすべて避
けられただろう.」最高レベルのプログラマでさえ実装となれば問題に突き当た
るのだから,人々にそれほどの先見の明を期待するのはどうやら無茶のようだ.
きっと「計画−実装」方式は,我々の持つ限界により適した別のアプローチで置
き換えられるのではないか.
適切なツールがあるならば,プログラミングへの別
のアプローチが可能だ.なぜ実装の前に計画を立てるのか? プロジェクトの立
案にどっぷり浸かり込むことの大きな危険性は,自らを袋小路に追い込んでしま
う可能性がある点だ.もっと柔軟なプログラミング言語があれば,この心配を減
らせるのでは? そのとおり.そしてそういうプログラミング言語がある.Lisp
の柔軟性は全く新しいプログラミングのスタイルを生み出した.Lisp において
は,計画の大部分を立てるのはプログラムを書きながらでいい.
なぜ後知恵が浮
かぶのを待つのか? モンテーニュ?1が気づいたように,考えを明確にするには
それを書き下ろそうとすることが一番だ.自らを袋小路に追い込んでしまうと
の心配からひとたび解放されれば,この可能性を最大限に活用できる.プログラ
ムを書きながら計画を立てる能力は2
つの重要な結果につながる:まず,プログ
ラムを書くのにかかる時間が短くなる.計画を立てると同時にプログラムを書い
ていると,注意を集中すべきプログラムの実物を常に手にしていることになるか
らだ.そしてその方法で出来たプログラムはより良いものになるだろう.プログ
ラムの最終デザインが常に進化の産物として出来上がるからだ.プログラムがあ
るべき姿を探している間に,一つの原則間違っていた部分を,見つけ次第その場
で必ず書き直すを守る限り,最後に出来上がったものは,あらかじめ計画に数週
間を費やした場合よりも優美なプログラムになるだろう.
Lisp が多目的なプロ
グラミング言語だからこそ,この種のプログラミングが実用的な代替手段にな
る.事実,Lisp の持つ最大の危険はLisp がユーザを堕落させてしまうかもしれ
ないことだ.一度Lisp をしばらく使うと,プログラミング言語とアプリケー
ションとの相性に敏感になりすぎ,元々使っていたプログラミング言語に戻って
も,これでは必要な柔軟性が手に入らないという思いに常に囚われるようになり
かねない.
1.2 ボトムアッププログラミング
プログラムの個々の機能的要素をあ
まり大きくしすぎてはならないというのが,プログラミングスタイルの長年の原
則だ.プログラムの構成要素が,読めば理解できる状態を超えて肥大化するな
ら,それは複雑さの塊に成り果て,(大都市が流れ者を隠すように)簡単にエ
ラーを覆い隠す.そういうソフトウェアは読みづらく,テストしづらく,デバッ
グしづらい.
この原則に従い,大規模なプログラムは部品へと分割しなければい
けない.またプログラムが大規模であればあるほど,さらに分割しなければいけ
ない.プログラムを分割する方法とは何か?
伝統的アプローチはトップダウン
デザインと呼ばれる:「このプログラムの目的はこれらの7 個だから,プログラ
ムを7 個の主要サブルーチンに分割することにする.1 個目のサブルーチンはこ
れら4 個のことを行わなければいけないから,それ自身のサブルーチンが今度は
4 個になり,. . . 」といった具合だ.このプロセスはプログラム全体が適切な
粒度すべての部分が意味のある仕事を行えるだけの大きさでありながら,単一の
ユニットとして理解できるくらい小さくなった状態になるまで続く.
熟練Lisp
プログラマがプログラムを分割する方法は違っている.トップダウンデザインと
同様,彼らには従う原則があり,それはボトムアップデザインプログラミング言
語を問題に適するように変えていくと呼ばれる.Lisp
では,プログラムをただ
プログラミング言語に従って書くことはしない.プログラミング言語を自分の書
くプログラムに向けて構築するのだ.プログラムを書いているとき,「Lisp に
○△のオペレータがあればなあ.」と思うことがあるかもしれない.そうしたら
それを書けばいい.後で,新しいオペレータの使用がプログラムの別の部分のデ
ザインを簡潔にまとめることにつながったと気づくだろう.そういった感じでプ
ログラミング言語とプログラムは共に進化する.交戦中の2 国間の国境のよう
に,2 つの境界は何度も書き直される.それが落ち着くのは,山や川(ここでは
ユーザの問題の持つ自然な境界)に辿り着いたときだ.最終的には,ユーザのプ
ログラムではプログラミング言語がそのために設計されたかのような見かけにな
る.そしてプログラミング言語とプログラムが相性良く落ち着いたとき,ユーザ
は明快で小規模で効率的なコードを手にする.
ボトムアップデザインは,同じプ
ログラムをただ別の順番で書くだけのことではないということは,強調しておき
たい.ボトムアップでプログラムを作ると,出来上がるものが違ってくるのだ.
単一の一体となったプログラムではなく,より抽象的なオペレータを持つ大規模
なプログラミング言語と,それで書かれた小規模なプログラムが出来るのだ.
ユーザは戸口に重くかぶさるまぐさ石ではなく,弧を描いて高く立つアーチを手
にする.
典型的なコードでは,瑣末で定型的な処理を一度抽象化すると,残るも
のはずっと短い.プログラミング言語を高く構築すればするほど,トップから降
りてくる道のりは短くなる.これはいくつかの長所をもたらす:
1. プログラミ
ング言語に仕事を任せることで,ボトムアップデザインは小規模で機敏なプログ
ラムを生む.短いプログラムは多数の構成要素に分割する必要がない.そして構
成要素が少ないということは,プログラムが読みやすく修正しやすいものだとい
うことだ.また構成要素が少ないということは,構成要素同士の連結も少ないと
いうことなので,そこでエラーが起きる可能性も少ない.工業デザイナが機械の
可動部分を減らそうと努力するのと同様に,熟練Lispプログラマはボトムアップ
デザインを使ってプログラムの大きさと複雑さを減らそうとする.
2. ボトム
アップデザインはコードの再利用を促進する.プログラムを2 つ以上書くとき,
最初のプログラムのために書いたユーティリティの多くは他のプログラムでも有
用になる.ユーティリティの大規模な基盤を手にしてしまえば,新しいプログラ
ムを書く手間は,Lisp そのもので書かなければならないときにかかる手
間の数分の一にすぎない.
3. ボトムアップデザインはプログラムを読みやすく
する.この種の抽象化に従ったものは,読む人に汎用オペレータを理解するよう
要求する.それに対し機能の抽象化に従ったプログラムは,読む人に特定用途の
サブルーチンを理解するよう要求する1.
4. ユーザにコード内のパターンに常に
関心を払うようにさせる.ボトムアップでの作業はプログラムのデザインに関す
るアイディアを明確にするのに役立つ.一つのプログラムの中で種類の違う2 個
の構成要素が形の上で似ているなら,類似性に気づくよう促されるし,おそらく
単純な方法でプログラムをデザインし直すよう促されるだろう.
ある程度までは,ボトムアップデザインはLisp 以外のプログラミング言語でも可能だ.ライ
ブラリ関数を見ればそこには必ずボトムアップデザインの例がある.しかしLisp
はこの点に関してずっと幅広い力を与え,プログラミング言語がそれに見合った
大きな役割をLisp のスタイルで演じるよう促すその役割があまり大きいので,
Lisp はただのプログラミング言語の一つではなく,全く違ったプログラミング
方法になっている.
このスタイルの開発は,小規模なグループによって書ける程
度のプログラムに適しているというのは確かに真実だ.しかし同時に,このスタ
イルは小規模グループのなし得ることの限界を拡張する.Frederick Brooks が
『人月の神話』(The Mythical Man-Month) の中で示唆したのは,プログラマの
グループの生産性はその規模に対して線形には増大しないということだった.グ
ループのサイズが増大するにつれ,個々のプログラマの生産性は低下してゆく.
Lisp プログラミングの経験は,この法則のポジティブな捉え方を示唆してい
る:グループのサイズが減少するにつれ,個々のプログラマの生産性は向上して
ゆくのだ.相対的に小規模なグループが勝利を収める.理由は単純,小さいか
ら.小規模グループがLisp によって可能になるテクニックを活用するとき,完
全な勝利が待っている.
1 「でも君のユーティリティを全部理解しないことには
プログラムが読めなくなるじゃないか.」そういった言葉は大抵誤りだ.なぜか
については,4.8 節を参照.
1.3
拡張可能なソフトウェア
Lisp スタイルのプロ
グラミングは,ソフトウェアが複雑さを増すにつれ重要性を増してきた.今時の
ユーザからのソフトウェアへの要求はあまりに多く,プログラマにはほとんど予
想しきれない.ユーザ自身も要求のすべてを予想することができなくなってい
る.しかしユーザの望みを完璧に叶えるソフトウェアをプログラマが供給できな
くとも,プログラマには拡張できるソフトウェアを供給することはできる.プロ
グラマが自分のソフトウェアをただのプログラムからプログラミング言語に転換
すれば,技術の高いユーザは必要な付加的機能をその上に作り上げられる.
ボト
ムアップデザインは拡張可能なプログラムに自然につながっていく.ボトムアッ
ププログラムの最も単純なものは,2 層から成る:プログラミング言語とプログ
ラムだ.複雑なプログラムも一連の層として書き上げることができる.それぞれ
の層は1
段下の層に対してプログラミング言語として機能する.この方針が最
上層まで貫かれれば,その層がユーザの使うプログラミング言語となる.そのよ
うなプログラムではあらゆるレベルで拡張が可能になっていて,伝統的なブラッ
クボックスとして書かれ,後から拡張性を付け加えたシステムよりもはるかにい
いプログラミング言語が出来上がることが多い.
X Windows とTEX はこの原則に
基づくプログラムの古い例だ.1980 年代には高性能のハードウェアによって
Lisp を自らの拡張言語とする新世代のプログラムが可能になった.その最初は
有名なUnix のテキストエディタ,GNU Emacs だ.次はAutocad で,これはLisp
を拡張言語とする大規模商用製品としては初になる.1991年にはInterleaf の
新バージョンがリリースされたが,それはLisp を拡張言語に使っていただけで
はなく,かなりの部分がLisp で実装されていた.
Lisp は拡張可能なプログラム
を書くためには素晴らしくいいプログラミング言語だ.それはLisp 自身が
拡張可能なプログラムであるからだ.Lisp の拡張性をユーザにも渡すような
Lisp プログラムを書けば,実質的には何もせずに拡張言語が出来たことにな
る.そしてLisp でLisp プログラムを拡張することと,伝統的なプログラミング
言語でそれを行うこととの違いは,誰かに直接会うことと手紙でやりとりするこ
ととの違いのようなものだ.外部プログラムへのアクセス手段を提供するだけの
拡張方法しか用意していないプログラムでは,あらかじめ決められたチャンネル
を通じて連絡し合う2 つのブラックボックスになるにすぎない.Lisp では,
拡張機能は背後にあるプログラム全体に直接アクセスできる.ユーザにプログラ
ムのあらゆる部分へのアクセスを与えなければならないと言っている訳ではな
い.ただアクセスを与えるか与えないかをあなたが選べるということだ.
このレ
ベルのアクセスがインタラクティブな環境と結び付くと,最高の拡張性が得られ
る.自分のプログラムの拡張機能の基礎として使えるようなプログラムは,どれ
もかなり大規模になりがちだ.おそらく規模が大きすぎて全体的なイメージが掴
めないほどだろう.何か不確かな点があるときどうなるだろう? そのとき元の
プログラムがLisp で書かれていれば,それをインタラクティブに調べることが
できる:データ構造を調査できる.関数を呼び出せる.ソースコードを読むこと
さえできる.この種のフィードバックにより,確かな自信を持ってプログラムを
製作できる.思い切った拡張機能を書けるし,しかもそれが素早くできる.イン
タラクティブな環境は常にプログラミングを容易なものにしてくれるが,拡張機
能を書いているときほどそれがありがたいときはない.
拡張可能なプログラムは
諸刃の剣だが,最近の経験によればユーザはただの剣より諸刃の剣のほうを好
む.どんな危険性が備わっていようとも,拡張可能なプログラムのほうが勝るよ
うだ.
1.4 Lisp の拡張
Lisp
に新しいオペレータを加えるには2 通りの方法があ
る:関数とマクロだ.Lispではユーザの定義した関数は組み込み関数と同じ地位
を占める.もしmapcar の変種が新しく必要になったら,それを自分で定義し,
mapcar を使うのと同じようにそれを使うことができる.例えば,ある関数が1
から10 までの整数に適用されたときにそれが返す値のリストが必要なら,新し
いリストを作ってそれをmapcar に渡すことができる:
(mapcar fn

(do*
((x 1 (1+ x))

(result (list x) (push x result)))


((= x 10) (nreverse result))))
しかしこの方法は格好悪いし非効率だ2. 代わ
りに新しいmap 系関数map1-n(p. 55参照)を定義し,それを次のように呼び出
せばいい:
(map1-n fn 10)
関数を定義するのは比較的真っ当な方法だ.マクロは
新しいオペレータのさらに一般的な(しかしあまり理解されていない)定義
方法を提供する.マクロはプログラムを書くプログラムだ.この文には非常に深
い意味が込められている.そしてその探求はこの本の主目的の一つなのだ.
マク
ロを注意して使えば驚異的に明解でエレガントなプログラムができる.もちろ
ん,これらの宝石のようなプログラムがただで得られる訳ではない.最後にはマ
クロは世界で一番自然なものに思えるだろうが,最初は理解が難しい.これはマ
クロが関数よりも一般的で,書くときに注意すべきことが多いせいもある.しか
しマクロの理解が難しい大きな理由は,それが全く異質(foreign) なものだから
だ.Lisp のマクロのようなものを持つ言語は他にない.だからマクロを学ぶに
は,他のプログラミング言語から気づかずに学んだ先入観を振り捨てることを
要求されるかもしれない.そのなかの主要なものは,死後硬直に悩まされるプロ
グラムという概念だ.なぜデータ構造が流動的で変更可能であるべきなのに,プ
ログラムがそうであってはいけないのだろうか? Lisp ではプログラムがデータ
であるのだが,この事実の持つ意味をモノにするにはしばらく時間がかかる.
2 これは新しいCommon Lisp のシリーズマクロを使ってもっとエレガントに書くこ
ともできる.しかしこれらのマクロ自体がLisp の拡張なので,結局は同じこと
だ.
マクロに慣れるのにしばらく時間がかかっても,それは努力に見合うこと
だ.繰り返しのようなありふれた用途でも,マクロはプログラムを抜群に小型で
きれいなものに変える.ここで,あるプログラムがコード本体をx についてa か
らb まで繰り返さなければならないとしよう.Lisp 組み込みのdo はもっと
一般的な目的のためのものだ.それを単純な繰り返しに使うと一番読みやすい
コードにはならない:
(do ((x a (+ 1 x)))

((> x b))
(print x))

れを,こう書けるとしたらどうだろうか:
(for (x a b)
(print x))
マクロがこ
れを可能にする.6 行のコードで(p. 159 参照)for
文をこのプログラミング
言語に追加できる.そしてそれは初めからあった構文のように機能する.後の章
で見るように,for
の実装はマクロでできることの手始めでしかない.
Lisp の
拡張で一度に使えるのは関数やマクロ1 個ずつに限られる訳ではない.必要とあ
ればあるプログラミング言語全体をLisp の上に構築し,それを使ってプログラ
ミングすることもできる.Lisp
はコンパイラやインタプリタを書くのに最適の
プログラミング言語だが,新しいプログラミング言語を定義する別の方法を提供
する.そのほうがしばしばエレガントだし,労力が少なく済むのは確かだ:それ
はLisp
を修正して新しいプログラミング言語を定義する方法だ.そうすれば
Lisp
の機能のうち新しいプログラミング言語でも変更せずに使える部分(例え
ば算術演算やI/O)はそのまま利用でき,異なっている部分(例えば制御構造)
だけ実装すればいい.このように実装されたプログラミング言語を埋め込み言語
と呼ぶ.
埋め込み言語はボトムアッププログラミングの自然な帰結だ.Common
Lisp には既にいくつか例がある.一番有名なCLOS については後の章で議論す
る.しかし自分だけの埋め込み言語を定義することもできる.自分のプログラム
に適した埋め込み言語を作ることができ,それをLisp とかけ離れたものにする
ことさえ可能だ.
1.5 なぜ(またはいつ)Lisp か
これらの新たな可能性は
魔法の要素たった1 個から生まれる訳ではない.この点を見れば,Lisp はアー
チのようなものだ.楔形の石(迫石?2)のうち,どれがアーチを支えているの
か? これは質問そのものが誤っている:どの石もアーチを支えているのだ.
アーチと同様,Lisp は組み合わさった機能の集合体だ.それらのいくつかをこ
こで挙げることができる動的メモリ割り当てとガーベジコレクション,実行時
型指定,オブジェクトとしての関数,リストを生成する組み込みパーサ,リスト
として表現されたプログラムを受け付けるコンパイラ,インタラクティブな環境
等々しかしどの一つをとってもLisp の持つ力の理由にはならない.Lisp プログ
ラミングをLisp プログラミングたらしめているのは,そのコンビネーション
だ.
過去20 年でプログラミングの方法は変化した.インタラクティブな
環境,動的リンク,オブジェクト指向プログラミングまでこれらの変化の多く
は,Lisp の柔軟性を幾分かでも他のプログラミング言語に与えようとする細切
れの試みだった.アーチの喩えは,それらがどれほど成功を収めたかを示唆して
いる.
Lisp とFortran が現存するプログラミング言語のうち最も古いものだと
いうことは,よく知られている.おそらくもっと意味のある事実は,それらはプ
ログラミング言語のデザインの思想のうち対極にあるものを代表しているという
ことだ.Fortranはアセンブリ言語からの進歩として開発された.Lisp はアルゴ
リズムを表現するプログラミング言語として開発された.そういった異なる意
図は,大きく異なるプログラミング言語を生んだ.Fortran はコンパイラ開発者
の人生を楽にしてくれる.Lispはプログラマの人生を楽にしてくれる.そ
れ以来,大抵のプログラミング言語は2 つの極の間のどこかに位置するものだっ
た.そしてFortran とLisp は真ん中に向かって歩み寄ってきた.Fortran は今
ではずいぶんAlgol に似てきたし,Lisp は若かりし頃の無駄な習慣をいくつ
か諦めた.
最初のFortran とLisp は一種の戦場のようなものを定義した.片方
では鬨の声は「効率~!(それに実装が大変すぎるだろうし)」で,もう片方で
は鬨の声は「抽象化~!(これは商用ソフトじゃないし)」だ.古代ギリシャ
の戦争の結果を神々が高みから決めたように,この戦の結果はハードウェアに
よって決められるようになっている.年を追うごとに情勢はLisp
側に有利に
なってきているようだ.今ではLisp に対する議論は,1970
年代初頭にアセンブ
リ言語プログラマたちが高水準プログラミング言語に対して仕掛けた議論に非常
に似てきた.今や問いはなぜLisp か? ではなくいつLisp か? になっている.
*2 訳注:voussoir: アーチや丸天井に使われる楔形の石材.

登録情報

  • 出版社 ‏ : ‎ オーム社 (2007/3/1)
  • 発売日 ‏ : ‎ 2007/3/1
  • 言語 ‏ : ‎ 日本語
  • 単行本 ‏ : ‎ 440ページ
  • ISBN-10 ‏ : ‎ 4274066371
  • ISBN-13 ‏ : ‎ 978-4274066375
  • カスタマーレビュー:
    4.8 5つ星のうち4.8 15個の評価

著者について

著者をフォローして、新作のアップデートや改善されたおすすめを入手してください。
ポ−ル・グレアム
Brief content visible, double tap to read full content.
Full content visible, double tap to read brief content.

著者の本をもっと発見したり、よく似た著者を見つけたり、著者のブログを読んだりしましょう

カスタマーレビュー

星5つ中4.8つ
5つのうち4.8つ
15グローバルレーティング

この商品をレビュー

他のお客様にも意見を伝えましょう

上位レビュー、対象国: 日本

2018年4月13日に日本でレビュー済み
Amazonで購入
マクロとは何か考えさせられる本です。
この本を読んだら後は自分で考えて自分のLispを構築すればよい。
6人のお客様がこれが役に立ったと考えています
レポート
2016年2月25日に日本でレビュー済み
Amazonで購入
有名なLispハッカーである著者が、Common Lispの最大の特徴たるマクロについて解説した本です。しかし殆どの人にとって耳慣れないのはマクロもそうですが、ボトムアップ・プログラミングという考え方でしょう。大規模プロジェクトは計画→実行、で行われる。これがトップダウン。これに対しボトムアップは細部から始まり大きなものになるという。細部というのはLispの場合は関数1つ。これをテストしてひとつの大きなものを作ってゆく。「レンガの一つ一つがしっかりしていれば、壁もしっかり立つだろう」というわけです。
著者が他のエッセイで書いている「プログラミングとデッサンは似ている」や「コードの抽象化」についても理解の深まる一冊です。
訳者のWebサイトでPDF版が公開されていますが一部LaTeXのままというか引用先などが一時的なタグのままなので、読むと混乱します。予算に余裕があれば紙の本を買うことをお薦めします。難解な抽象的概念が散りばめられているので未だ全貌を読むことは出来ませんが、これを読みこなせればプログラマーとして一皮も二皮もむけた人物になれるでしょう。
5人のお客様がこれが役に立ったと考えています
レポート
2013年6月13日に日本でレビュー済み
この本はLisp初心者には難しいし、向いていません。まずはS式に慣れてください。この本はCommon Lisp初心者が中級以上にステップアップするのに助けてくれる本ですね。この本とNovingの本 実用 Common Lisp (IT Architects’Archive CLASSIC MODER) をこなせればCommon Lispの相当な使い手になってますね。

内容的には計算機科学の基礎知識も必要になってきますので、簡単ではないけど、マクロの強力さを嫌というほど教えてくれますね。Common Lispを知らなかったとしても少なくともS式に慣れ親しんでいるというのは最低限必要ですね。

マクロでマクロを作ったり関数を作ったりということは、使い慣れたら本当に便利で増えるわかめのように使えて、開発時間を縮小できるんですが、コードを読むのが大変になりますので、使い方を誤らないようにしたいですね。この辺を使いこなせる人は限られてるんですけどね。(抽象化、一般化をすることがかなり得意な人ですね。)
6人のお客様がこれが役に立ったと考えています
レポート
2014年3月5日に日本でレビュー済み
Amazonで購入
pdfが公開されています。
on lisp pdf で検索してください。
40人のお客様がこれが役に立ったと考えています
レポート
2013年10月26日に日本でレビュー済み
何度も挫折を繰り返し、その合間にScheme、Gauche、Clojureを勉強して力をつけ、ようやく読み終えた。でも、すべて吸い尽くしたとはとても言えない。白状すると、掲載コードを追いかけるのは途中でやめてしまったので、読む目的は、マクロを書くテクニックを修得することから、マクロが実現する抽象性とその応用を知ることに変わった。

それでも十分、読む価値あり。ラストの、継続、非決定性、ATNパーサ、Prologコンパイラと続く流れは圧巻だった。継続や非決定性を、(HaskellやSchemeのように)言語がサポートするか、(CLのように)マクロで実現するかは、大した問題ではない。そういった抽象性を利用すれば、ATNパーサやPrologコンパイラのようなアプリがいかに素直に書けるかを知ることが大事だと思う。

とは言え、CLのマクロがもたらす柔軟性は魅力的だ。Schemeのマクロは物足りない。Clojureで行くと決めた自分としては、CLに近いマクロを持つことが嬉しい。さて次は、Let Over Lambdaに再挑戦しよう。
8人のお客様がこれが役に立ったと考えています
レポート
2008年2月27日に日本でレビュー済み
Scheme で Lisp の洗礼を受けた自分は,本書を読むまで hygienic でないマクロに対して偏見を持っていましたが,読後徐々にその考え方は変わっていきました.
冒頭の引用にある「Lisp はプログラム可能なプログラミング言語である」,この特徴に大きく貢献しているマクロの使い勝手やテクニックを,実例を交えながらこれでもかというほど見せてくれる.何度も読み返してはその知恵を肌身に染みこませていきたい,そういう類の本です.
22人のお客様がこれが役に立ったと考えています
レポート
2007年6月15日に日本でレビュー済み
本書の著者ポール・グレアムの別の著書「ハッカーと画家」(オーム社)で、グレアムはLisp言語の実用でのメリットを強く主張していた。WebシステムにおいてもLispを採用することで、グレアムのベンチャー企業はライバル会社よりはるかに早く強力なシステムを開発し、競争に勝ち続けた。Web開発言語もPerlからPython、そしてRubyが支持されてきているが、それはLisp化への流れであるという。

しかし、学術的なLispのテキストを見ても、なかなかそれが理解できなかったので、グレアム自身がこれを懇切丁寧、そして実践的に解説してくれている本書は実に興味深いと思う。

グレアムが強調するLispのメリットはマクロである。本書でも、マクロは機能面は(Lisp独特のクセも含め)もとより、微妙な問題でもある、マクロを使うべき場面、関数との使い分け、効果的なマクロの定義方法からマクロの欠点まで、絶妙な実例を参考にしながら教えてくれている。さらに、Prolog言語の実装やオブジェクト指向Lispも簡易ながら実践的に解説しているのも面白い。システム開発のライバルには読ませたくない本だ。
47人のお客様がこれが役に立ったと考えています
レポート
2013年1月5日に日本でレビュー済み
私は今40代のオジサンですが、高校生の時以来プログラムを書いてます。
Lispはemacsのカスタマイズのため「だけ」に勉強しました。
会社ではオブジェクト指向言語ばっかり(過去にC++,今はJava,Ruby)使っています。
Lispで書いたのは人生で数千行程度だと思います。筋金入りのLispハッカーではございません。

この本は、近年lispの本をちらほら見かけるので買ってみた本の一つです。
本書の主張は、「Lispはマクロがすごいんだぞ」、ということに集約されると思います。

マクロの効用は、新しい構文を言語に導入でき、それが組み込みのもともとの機能と
全く対等に使えるようになることです。ネイティブコードにコンパイルするLispの処理系
なら、性能的にも、組み込みの構文と全く対等です。

それはそうなんですが、構文レベルでのアイディアがプログラマのアイデア次第で
追加されてしまうと、ソースを読むのが、恐ろしく難解になります。
調子に乗って、マクロをホイホイ使ってプログラミングしてしまうと、覚えることが
それだけ増えてしまいます。

新しい言語を習得するときに大変なのは、構文を覚えること、イディオムを覚えること、
ライブラリを覚えることだと思います。近代的な言語は、構文のフレキシビリティは
それほど高くない。そのおかげで、覚えることを減らしているのです。

そんなふうに感じたものですから、読んでみましたけれど、「うん、これは重要な
ムーブメントだ、やはり企業ももっとLispを使うべきだ」とは感じませんでした。
24人のお客様がこれが役に立ったと考えています
レポート