孤独にそっくり

開いている窓の前で立ち止まるな

Land of Lisp 17章〜20章+αまで読んだ(Land of Lisp 読了)

f:id:ponkim:20160517113718p:plain
http://www.lisperati.com/logo.html

とりあえず、ざっと読みました。本当にざっとしか読んでいません。
なので、かるーく言葉の説明を覚書しようと思います。

第17章 ドメイン特化言語DSL

  • マクロを使うと簡単にDSLを作ることができる
  • 補助関数を書くと、マクロをよりスッキリ書ける
  • DSLは便利

とりあえずゲームコマンドを定義するときのように似た形があるときには、DSLを作ることでスッキリ書けるということがわかった。
…たぶんわかった。

第18章 遅延プログラミング

  • 遅延評価

関数型プログラミングで引数に依存して書くと、引数に膨大な情報を渡す必要がある。
また、ダイス・オブ・ドゥームのゲーム木のように、全ての可能性を計算すると大変なことになる。
それを解決するのが遅延評価だ。
遅延評価とは、必要な時に、必要なだけ実行するということ(?)。HaskellClojureだとコアでサポートしているらしい。
今まで使ったコードの一部を遅延リストライブラリで書き換えるだけですぐに高速化できたのですごいと思った。

  • ゲームAIの挙動

これまでは全部の可能性を計算してから最善手を決めていたが、それだと大変。選択肢を絞るように改良したい。
そこで、探索木の刈り込みを行った。ゲーム木を刈り込むことで、AIプレイヤは常に最善な手を指すわけではなくなった。
「完璧な手」から「なるべく上手い選択肢」に変わったが、これをヒューリスティック的であるという。

  • アルファ・ベータ法

更にAIを改良する。アルファ・ベータ法は、ミニマックスアルゴリズムの最適化法である。

アルファ・ベータ法は大昔に勉強したはずだけど忘れた。ここは本で読んでもわかりにくかったので、ググった。
http://aidiary.hatenablog.com/entry/20050205/1274150331
http://www.geocities.jp/m_hiroi/light/pyalgo24.html
を読んだらなんとなくわかった。
先手とか後手とか評価値とかMINとかMAXとかややこしいけど、論理的に考えたら見なくていい枝をカットするってこと。

第19章 ダウス・オブ・ドゥームにグラフィカルなWebインタフェースをつける

SVGでアレするとブラウザでゲームできるよ。
f:id:ponkim:20160517125216p:plain
と思ってやったけどできない!!!
サポートページ
http://practical-scheme.net/wiliki/wiliki.cgi/Shiro:LandOfLisp
みたら、原書サポートページのソースコードじゃダメ的なことが書いてある。
一応、自分が読んでいる版を確認(この本は図書館で借りてきました)。
>2013年2月22日 初版第1刷
ああ、誤植とか多いわけだ。
ということでお手上げです。

第20章 ダイス・オブ・ドゥームをさらに面白く

パラパラ読んだけど、結局ブラウザで遊べないから悲しかった。

LISPの国

最後にLISPの国っていう漫画が載ってる。
LISPエイリアンたちの巨大な宇宙船団についての説明が面白おかしく書いてあった(ArcとかClojureとかSchemeとか出てくる)。
読んでて楽しかった。

まとめ

プログラミングよくわからない…プログラミングの勉強したい…でも、普通の言語の入門書とかすぐに投げ捨てそうなだと思って手に取ったのがLand of Lispでした。ひとまずざっとですが、通しで読めたのはやはりこの本に凝らされた楽しい工夫のおかげだと思います。ヘンな漫画が載ってる、楽しいゲームが作れる、すごく頭がよさそうなコードが書いてある。これだけで、Land of Lisp最高だと言って差し支えないのではないでしょうか。ただ、プログラミング初心者には厳しいところも多々あったので、理解できたという感じはありませんでした。特に、16章以降はもう読む元気がなくなっちゃいましたね。最後もゲームできないからうわーって思いながら流し読みしていました。とはいえ、Lispに関する興味は前からあったので、それなりに楽しかったです。次は、『ハッカーと画家』で有名なポール・グレアム氏のOn Lispか実践Common Lispあたりを読もうかな。マクロもちゃんと理解したいですから。もしくは、このブログで何度も引用しているM.Hiroi's Home Page / xyzzy Lisp Programmingさんを読むとか…。別にプログラミング自体好きになれそうもないうえに、プログラミングでこれがしたい!ってことがないのが悩みの種ですが、人工知能とか機械学習とか最近ホットなワードのあたりを知りたいので、Common Lispもいいですけど、Pythonの勉強もしたいですね。プログラミングができる人って、何を指針に勉強するんでしょうか。ともかく、本だと一冊読み終えたという達成感が少なからずあるので、何か探そう。あと、Land of Lispは気が向いたら新しい版を買おうかな…。
以上で、Land of Lispを読むシリーズはおしまいになります。ありがとうございました。