maya's blog

About programming, aws and ubuntu

Practical Common Lisp 読書メモ

Practical Common Lisp の読書メモ。
日本語版の書籍も出ている。

TODO: 読み次第追記

Introduction: Why Lisp?

  • 「FORTRANの代わりにLISPを用いたアプリケーション開発に成功したことを、筆者の父はLISPのおかげだで成功したと確信している」という逸話があるが、父の確信は恐らく間違っている。
    • 当時Lispは他の言語と比べて優れていたかもしれないけど、1980年代の話で現代に通用するとは限らないよね
    • 父が1980年代に成功した頃の恩恵と同じ恩恵を今日受けることができるだろうか?
  • 筆者が初めてPerlでMother Shopという雑誌のオンラインディスカッションフォーラムと、1996年のオリンピックにNikeが作ったもののようなOrganic OnlineのWebショップを構築した。その際に、Perlの厳しさを実感
  • その後様々な言語に触る機会があった
    • 今のBEAの一部であるWebLogicでJava開発者
    • トランザクショナルメッセージシステムをJavaで開発するスタートアップに参加
    • それらの間で、C, C++, Python等のメジャーな言語やSmalltalk, Eiffel, Beta等のマイナーな言語を探求
  • そのため、メジャー言語とマイナー言語、その間の言語(これがLispのこと?)に精通していた
  • だけど、結局自分のプログラミング言語に対する興味というのは父の話によって植え付けられたLispの考えが根源となっていることに気づいた
  • Lispの学習にはほとんど時間を費やさず、Lispは手に馴染むもので好きなときにLisp Hackingに勤しんだ
  • Lispだといつでもアイデアをコードに書き起こす作業が容易だったのは快感だった
    • 1週間程度で、初期のJava Programmerだったころに書いたプログラム(Goというゲームをプレイするための遺伝的アルゴリズムを育てるシステム)のLispバージョンを書くことに決めた
    • Common Lispの知識が初歩的で基本的な関数でさえ調べる必要がある程度の障害があったとしても、Javaで書き直すより生産的に感じた。
  • WebLogicの頃に、Javaで書かれたライブラリをきれいにしようとしたけれど良い方法が見つからなかった。けれど、Common Lispならたった2日でできた。
    • 結局javaのclass file解析器(Parser)だけでなく、一般用途の様々なバイナリファイルを分割するライブラリを開発できた
    • Chapter24, 25でも話すけど、MP3ファイルのID3タグの解析器とかね

Why Lisp?

  • 一部の言語では、見返り(payoff 恐らく言語を学習することで得られる恩恵)は明らか
    • Unix環境でlow-levelコードを書きたいのであればC
    • 他環境で動作するクロスプラットフォームアプリケーションを書きたいのであればJava
    • まだC++を使っている会社は多いから、C++をやるのもありだよね
  • だけれど多くの言語では、見返りはそう簡単には分類できない。主観的評価にも関わってくるからね。
    • Perlは「簡単なことを簡単にし、難しいことを可能にする」「やり方は何通りもある」
    • Pythonは「やり方は一つしかない」という考えがあるため、クリーンでシンプルであり、読みやすいコードになる
  • じゃあCommon Lispはどうだろう?
    • Common LispをCやJava, C++のように採用するのとは異なり、直ぐに明らかな見返りはない
    • Common Lispを使うことの恩恵は、Common Lispを使った経験とより関連している
  • Common Lispのモットーに一番近いものは「プログラム可能なプログラミング言語」
    • 謎多いけれど、このモットーはCommon Lispが多言語より優れていることの根源
    • 言語設計者にとって良いことが言語使用者にとって良いことである、という信念にCommon Lispは従う
    • Common Lispでは自分で機能を追加できる。より簡単なコードを書くために一部機能を言語自体に求めることは絶対にない。
  • 結果Common Lispプログラムでは、プログラムをどう動かすかというアイデアと実際に書くコードの間のマッピングがよりきれいになる傾向にある(→ 頭の中で考えていることをそのままコードに書きやすいということ?)
    • 定型コードと繰り返される慣用句によって、曖昧なコードでなくなる
    • 変更の度に大量のコードを読み通す必要がなくなるため、コードのメンテナンスがより容易になる
    • 全体的な振る舞いの変更は、局所的な変更で済むことが多くなる
    • 書く量が減りより早く開発できるようになる。言語の制限内できれいな書き方を求めるのに時間を費やすこともなくなる。
  • Common Lispは探索的プログラミング*1のための素晴らしい言語である。
    • 初めて腰を据えて書く際にプログラムがどう動くのかが定かでない場合には、Common Lispは徐々に、対話的に開発の手助けをする幾つかの機能を提供してくれる
  • 初学者にはREPL(read-eval-print-loop)がいいよ
  • Common Lisp Object System(CLOS); Common Lisp's powerful object system

Where It Began

  • リスト処理(LISt Processing)が得意なためLispという命名
  • 1956年 AI研究者のMcCarthyがAIプログラミングのために作った
  • 1980年代のAIブームで、自動定理証明*2やplanning and scheduling, computer vision等の難しい問題を解決するためにプログラマーがソフトウェアを書くのに好まれる言語であった
    • 冷戦でも用いられた。ペンタゴンがDARPAに大金を投資し、大規模戦場シュミレーションや自動計画、自然言語インターフェース等の問題解決のために多くのLispがフォークされるようになった
    • 必要に応じて今でもフォークされ、公開され続けている
  • 1980年代にLisp Machine*3というLisp実行コンピュータが開発された
    • 最も有名なLisp MachineはSymbolics社のもの
    • Lispはシステムプログラミング言語やOSを書く言語、エディタ、コンパイラ等Lisp Machine上で動作するものを書くために使われた
  • Lispの標準化は1981年にLispハッカー有志が集まって始められ、当時の様々なLispのいいところを集めたCommon Lispという新言語を標準と定めた
    • 1980年初期にAIの研究所やLisp Machineのベンダーが実装したLispを世の中に提供し始めて、様々な方言のLispが生まれることを懸念したため
  • 1986年に、Lisp方言を置き換えるために最初のCommon Lisp実装が公開された
  • 1996年ANSIがCommon Lisp標準を公表した
    • CLtLで指定された言語(方言のこと?)を元にして拡張
    • CLOSとcondition system等の機能を追加
  • 完全なLisp実装はGUIウィジェットアクセスやマルチスレッド制御、TCP/IPソケット等の動作環境を提供した
    • Common Lispはオープンソースのように進化し、必要とするライブラリが開発され、共有されるようになった
  • 一方で、Lispは成熟したコンピュータサイエンスの"classical"な言語の1つであった
    • 徹底的にモダンで、できるだけ効果的かつ堅牢に現実問題を解決する実用的アプローチが深く反映された一般用途の言語