Land of Lispを読んでみる – その2

前回に引き続き、がんばって 「Land of Lisp」を読んでいる。

コードが複雑になってきたので、普段使っているテキストエディタのVS Codeに、
カッコを色分けするエクステンション「Bracket Pair Colorizer 2」を導入。

第9章:いろいろなデータ型

配列、ハッシュ、ジェネリック、構造体
Javaのオーバーロードのような機能もあるのね。
作ったゲームは、RPGの戦闘シーンのような「オーク・バトル!」
ここで書いたコードは、約270行。
ただし、いくつかのモンスターの入力を省略。

これで、第2部のコア機能の説明が終了!

第10章:Loopマクロ

ここから第3部。Lispの周辺機能の解説。
まずは、Loopマクロの変態っぷりを味わう。

作例として、進化シミュレーションをLispで実装。
約200行。

これは、A・K・デュードニーの「コンピュータレクリエーション」に載っていた
「Simulated evolution: wherein bugs learn to hunt bacteria」をLispで実装したものだとか。
日本語版は、別冊サイエンス「コンピュータレクリエーションIV」の
「進化のシミュレーション:虫がバクテリアを食べるようになるまで」。

第11章:formatコマンド

機能豊富なformatコマンドの説明。

サンプルゲームは、クラシックなロボット対戦ゲーム。
50行ほどのコードだけど、Loopとformatがてんこ盛りなので
公式サイトからダウンロードしてみた。
http://landoflisp.com/source.html

第12章:ストリーム

標準入力、ファイル操作、ネットワークなど。どれも、ストリームで扱うことができる。

作例として、2つのclispコンソールを用意して、ネットワークを通じてテキストを送る。
Windows10でも、WSLのターミナルを2つ立ち上げて実行できた。

第13章:Webサーバーをつくる

ストリームで、標準入力やファイル・ネットワークが操作できるようになったので、簡単なWebサーバーを作る。そのために、例外処理についても取り上げる。

書いたコードは、100行くらい。
リクエストヘッダーとリクエストボディを解析して、動的なWebページを返す。

コードはちゃんと動いた。だけど、レスポンスはボディだけでヘッダーがない。そのせいか、ブラウザがちゃんとWebページを表示してくれない。Firefoxは、HTMLをテキストとして表示するし、Chromeは”正しいWebページではない”と言ってくる。結局、もうひとつWSLコンソールを立ち上げて、Curlコマンドで動作確認。

第13.5章:閑話休題

息抜きなのか!?なぞのマンガが登場。

Haskellをdisっているようにみえるが、はたして…

第3部、完。


というわけで、12日ほどで284ページ/475ページ。
ざっと60%をクリア。
Common Lispも、軽量スクリプト言語みたいに使えるんだな、ってことがわかってきた。
続く…


Land of Lispを読んでみる – その1

さいきんアウトプットが少ないと、オルターエゴが、どーもうるさい。

もうちょっとプログラミング能力を上げたいと思って、
長いこと積読になっていた「Land of Lisp」を読んでいるので、
その途中経過を書くことにした。

Lispの本は、全体的にアカデミックで小難しい雰囲気だけど、この本は違う。
作るのも、ゲームだし。ミュージックビデオもある!

読書方針としては、コードをちゃんと写経する。登場した関数の役割りをちゃんと確認する。
12月15日くらいから読みはじめて、年末年始にどこまで進むか!

はじめに

もう、ここから長いw。
11ページあって、Lispがどんなにすばらしいか、なぜマイナーなのか、
コンピュータの歴史にそってコミカルに描いている 。

第1章:環境構築

CLISPを導入する。
公式サイトでは、Windows用としてCygwin版を紹介しているが、
今となってはWSL(Windows Subsystem for Linux)が早いと思う。

詳しくは、clispのメモを参照

第2章:数当てゲーム

人間が考えた数字を、プログラムに当てさせるゲームを作る。
10行くらいで、データ定義や関数定義を学ぶ。

第3章:基本構文

リストとか、carとか、cdr。

第4章:条件分岐

nilの話。ifとかcond、case。

第5章:テキストゲームのエンジンを作る

テキスト型のアドベンチャーゲームのエンジン部分を作る。
walkとlook・pickupコマンドで、魔法使いの家を探検できる。
ここで書いたコードは、110行ほど。

ここで関数型プログラミングスタイルが出てくる。
関数型プログラミング言語は敷居が高いけど、
「引数かローカル変数しか参照せず、値を返すだけ」なら、
なるほど感がある。

第6章:コマンドインターフェースを改良する

ゲームのインターフェースを改良して、カッコなしでコマンドを受け付けられるようにする。
evalが登場。ここで書いたコードは、約56行。

第6.5章:Lambda登場

Lambdaのための短い章。
頭の中で、Lambdaをラムブダと呼んでいるヨ。

第7章:いろいろなリストと、ノード図の出力

ドットリストや連想リスト。
アドベンチャーゲームのマップを画像として出力する。
そのために、clispの中からGraphvizコマンドを呼ぶ。
ここで書いたコードは、約130行。

Lispは、関数をすぐに評価できるので、デバッグする場合も、テストデータをすぐ確認できる。
うむ、これは便利。
なので、関数ごとに簡単なテストパターンを用意して、チェックする。

第8章:荒くれシティでハンティング! グラン・セプト・ワンプス

ランダムに生成される街を探索して敵を見つけ出すゲームを作る。
その名も「グラン・セプト・ワンプス」
ここで書いたコードは、テストパターン込みで約250行。
街のマップを描くため、 前に作ったコードを再利用する。


と、ここまでで、だいたい1ヶ月。
読んだページは、145ページ/475ページ。
ちょうど30%か。

写経して、自分で入力したコードをデバッグしながらだから、ちょっと心が折れそうだったけど、コツがつかめてきたせいか、だんだん楽しくなってきました。

続く・・・。