#以前の版に上書きして出版しようとしましたが、新しく別に出版せよとの事なので新しく出版します。以前レビューしてくださった方には申し訳ないです。



#Kindle Paperwhiteで表示されていることを確認しています。今のところiOSには対応していません。



#なんだかおかしなレビューが投稿されていますが、まずこの本でLISPの機能を説明しているのは前半の一部分だけです。それから、これを投稿したレビュアーはどうも一章の途中で投げ出したようですが、一章は二章で必要になる事項の説明なので一章だけ読んで「無味乾燥」などと言われても困ります。



さらに言うならば、一章の説明は



・余計なゴタクを完全に排除し、小学生でもわかるような例をたくさん紹介することを通して説明をする

・例はLISPのすごさがはっきりと伝わるものにする



という二点を念頭に置いて書かれています。



プログラミング関係の技術書というのは、初心者が読んでも何の利益にもならないけれども、上級者には分かり切っているのでどうでもいいような下らないゴタクが多すぎます。そういうゴタクが多い一方で、肝心の例となるとこれがものすごい少ないんですよね。



なので、この本ではそういうダメな技術書とは全く逆のスタイルで書きました。たとえば、equalの説明は次のようになっています。



-----

equalは2つの引数を比較する。





(equal 2 2) => T

(equal 2 7) => NIL



(equal 'abc 'abc) => T

(equal 'abc 'abd) => NIL



(equal #'+ #'+) => T

(equal #'+ #'*) => NIL



(equal 'a 5) => NIL

(equal t #'+) => NIL



(equal '(a b c) '(a b c)) => T

(equal '(a a c) '(a b c)) => NIL

(equal '(a b c) '(a b c d e)) => NIL

(equal '(a (b c)) '(a (b c))) => T

(equal '(a (b c)) '(a (a c))) => NIL

(equal '(a (b c)) '(a b c)) => NIL

-----

これだけですが、はっきり言ってプログラミングとはなにかを説明するのに必要なのは、equalは二つの引数の値を比較して、同じならT、違かったらnilが返るということだけですよ。eq,eqlを扱うとコンピューターの内部構造について解説しないといけなくなるので、初心者向きの本としては不適切です。



それから上のequalの説明では、equalは構造を持つリストの比較ができるという事実を例として紹介しています。これを書いている入門書はほとんどないんじゃないんでしょうか？でも、equalで構造のあるリストを比較できるというのはすごいと思いませんか？一章では他にもLISPのすごい所を紹介しています。



はっきり言って、一章に書いてあるようなLISPの基本的な部分は小学生にも分かる事です。だって、他の事項もequalは二つの値を比較する、とか、そういう程度の話ですよ？分かるに決まっているじゃないですか！それが、この程度の事も分からない人がいると知って非常にびっくりしています。



それから、グラフィックやコンパイラなどの部分が何のために扱っているのかわからない、とか言っていますが、これらのグラフィックに関する章では何十枚もスクリーンショットを紹介して、どのようなプログラムなのかを紹介しています。それなのになんで「何のために扱っているのかわからない」という事になるのか、本当に意味が分かりません。



本の体裁のことでもゴチャゴチャ言っていますけれども、はっきりいって普通の本の体裁をしたものをそのまま電子書籍にしても読めたものではありません。改ページが多いのも、実際にKindleで読んでみて、１ページに１項目にしたほうが読みやすい事が分かったからです。まあ、確かに編集を楽にするためにサブセクションを作らないままにしているというのは事実ですが、しかしレビューで発狂するほどの事ですかね？少なくとも読めたものではない電子書籍よりはマシですし、一章に書いてある程度の内容も理解できないで何を言ってるのか、と思います。



あと、なんか関数型プログラミングに関する解説がないと発狂しているようですが、この本のプログラムは入出力を除いては全部関数的なので、本の内容自体が関数型プログラミングの解説になっています。関数型プログラミングの説明というのは、写像を組み合わせてプログラミングを構成すること、と一言いえばそれで終わりですが、これはある程度内容が進まないと説明できないし、内容が進んだら読者はもうそんな事は分かり切っているので、解説の置き場所がないんですよ。さらに、関数型プログラミングとは何か、ということを正確に説明するのはそれほど簡単ではありません。たとえば



(defun f (a b c z)

(let ((acc (+ a b)))

(let ((acc (+ c acc)))

(+ z acc))))

=> F



(f 1000 20 30 7)

=> 1057



というプログラムがあった場合、これは関数的ですか？



この本は関数型プログラミングとは何かについてゴタクを並べることなしに、読者の方が関数型プログラミングとは何か、を理解できるように書いています。再帰関数についての解説はどの本よりも詳しいはずです。



私はコンピューターとプログラミングの知識を前提としない、と書きましたが、どんな頭がおかしい人でも理解できる、と保障した記憶はありません。知っている限り、まともな人からの評判はいいです。文字数が無くなりましたが、とにかくこのレビューで不安になった方は百聞は一見にしかず、なので、ぜひサンプルをダウンロードしてみてください。場合によってはサンプル分だけでも２５０円程度の価値はあるんじゃないでしょうか。





本書はCommon Lispを用いて関数型プログラミングとは何かを説明したものである。Common Lispやプログラミングについての知識は全く必要としない。なので本書をCommon Lispの教科書として読む事もできるし、プログラミングをするとはどのような事なのか、を知るための教科書としても読める。



まず本書を書く上で考えたのは短い時間で、確実に最後まで読める本にするということである。そのために本書ではとにかく、簡単に理解ができるシンプルな例を多くした。例を一目見れば必要な事はほとんど伝わるように書いたつもりである。本書で定義する関数は一つ残らず、どのような入力に対して出力がどうなるかを例示してある。実行例を見てからプログラムがどうなっているかを読めばいいので相当早く読めるし、もしその場で理解できない事があっても、とりあえず関数がどう動作するかは分かるので先を読み進める事ができる。



もう一つ本書を書く上で考えたのは、読者の方々のさまざまな疑問を解消するような本にしようという事である。例えば、ＣＧで物体がぐるぐる回転するのを見て、子供の頃からあれはどうやっているのか、と疑問に思っている方は少なくないと思う。圧縮プログラムはどのようにデータ量を圧縮するのだろうか？２進数にしても、なぜマイナスの数を一発で掛け算できるのか納得できないプログラマーの方も多いのではないだろうか。本書ではこれらの疑問の答えを数十秒でわかるような形で書いた。



本書で扱うテーマはゼロから初めて、HTMLファイルの生成、3Dアニメーション、楕円軌道の計算、 LISPコンパイラ（というよりLISPプログラムをPostScriptに変換するトランスレーター）、LZハフマン圧縮などさまざまである。HTMLを生成するプログラムとLISPコンパイラは実際に本書を書くために使った。本書に出てくる図はすべて、このLISPコンパイラを使って生成したものである。外部ライブラリーは一切使っていない。



Common Lispを採用したのは、プログラミングの初心者にとってはLispが一番簡単だと考えるからである。Lispは覚えることが少ないし、入出力が非常に楽なので初心者でもすぐにプログラムそのものを始める事ができる。Common Lispは関数型言語ではないと考える人は多いが本質的には関数型言語であり、ただ破壊的な操作も可能なように拡張されているだけである。 本書のプログラムは、基本的にはすべて関数型プログラミングの手法で書かれている。データの入出力をする部分と計算をする部分（情報を処理をする部分）は完全に分離してある。



目次：

関数、シンボルおよびリスト

再帰関数

ラムダリストキーワード

末尾再帰

MAPCAR

クロージャー

多値

DO

乱数

文字と文字列

ファイル入出力

マクロ

遅延評価

HTML

マークダウン

2Dコンピューターグラフィックス

3Dアニメーション

天体の運動

PostScript処理系上のLispプログラム

２進数

Huffman/LZデータ圧縮



400ページほど