孤独にそっくり

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

Land of Lisp10章~13章まで読んだ

http://www.flickr.com/photos/12516383@N07/8517658785
photo by whileimautomaton
10章~13章まで読みました。

第Ⅲ部 LISPはハックなり

10章 Loopコマンドによるループ

loopはまっとなLispとは違って括弧が少ない。それに特殊なトークン(for, from, to等)が出てくる。

;5から10までの数値の合計
(loop for i
	from 5 
	to 10
	sum i)
>45

他にもリストの要素について繰り返すinトークンとかある。Pythonのfor文っぽい。
条件を満たした時だけ処理するのはwhenを使えばいい。
更にwhenを使うとループを途中で脱出することも出来る。

(loop from 0
	do(print i)
	when(= i 5)
	return 'falafel)
>0
>1
>2
>3
>4
>5
>FALAFEL

while(1)でループしてbreakするみたいな感じ。
あとcollectが便利。
collect : 値を集めてリストにしてくれる

(loop for x below 10
      for y below 10
          collect (+ x y))
>(0 2 4 6 8 10 12 14 16 18) 

for節は複数取れるけど、同時にループするから、デカルト積にしたいときはループをネストさせる。C言語で2次元配列を扱うときにやるforループの入れ子構造と同じ。
P194-195の「Loopマクロ周期表」にトークンの解説がたくさんある。網膜にレーザー光線で焼き付けたほうがいいらしい。

あとsome関数を忘れていたのでついでにシーケンス関数の復習。

  • find-if : 与えられた述語を満たす最初の要素を見つける
  • count : 特定の要素がいくつシーケンス中にあるかを数える
  • position ; 特定の要素がシーケンスのどの位置にあるのかを教えてくれる
  • some : シーケンス中に条件を満たす要素が最低一つあるか
  • every : シーケンス中の要素が全て条件を満たすか

進化ゲーム楽しかったけどループにかなり時間がかかった。

11章 format関数でテキストを表示する

とにかく盛りだくさんだけど、個人的にはC言語で初めてHello Worldしたり、printfした時のことを思い出した。
ただ、formatはかなり柔軟で色々なことが出来るらしい。

;基本形
(format 出力先 "制御文字列(制御シーケンスを含む)" 値引数)
;例
(format t "Add onion rings for only ~$ dollars more!" 1.5)
>Add onion rings for only 1.50 dollars more!

最終的に呪文みたいになった。

(format t "|~{~<|~%|~,33:;~2d ~>~}|" (loop for x below 100 collect x))

出力結果
f:id:ponkim:20160508135722p:plain

出力先である、出力ストリームは12章で扱う。
この章の内容は実際に書くときに見返す必要があるんだろうなって感じだった。

12章 ストリーム

異なるリソースとやりとりするために

  • コンソールストリーム : REPL
  • ファイルストリーム : ファイルの読み書き
  • ソケットストリーム : ネットワーク
  • 文字列ストリーム : 文字のやりとり

がある。ストリームに関してその他もろもろ。

13章 Webサーバを作ろう!

error関数
コンディション=他の言語でいうところの例外処理(exception)の話。

  • handler-case : ディクションが通知されたときにプログラムを中断する代わりに実行する処理をかける
  • unwind-protect : どんなエラーが起きても走らせなければならないコード(クラッシュしたときのリソース解放とか)を実行

ゼロからWebサーバを書く
http://landoflisp.com/webserver.lisp
Webサーバの仕組みやリクエストパラメータの説明。日本語だとデコードがめんどくさいらしい。
テストするときに、ソケットストリームではなく、文字列ストリームを使うことができるらしい。
用語が多くて心が折れそうだったので流し読みして、とりあえず動かした。f:id:ponkim:20160508133216p:plain
えっ?ちゃんと動いてないんですけど…
仕方ないからアドレスバーに直接nameをぶち込んだ。
f:id:ponkim:20160508133308p:plain
うーん…まあいいか。

13.5章 美しき哉 関数型プログラミング

おもしろ漫画が載ってた。Haskell共和国では副作用の使用が罪になるんだって。
Haskell共和国の入門書やばそう。
www.amazon.co.jp

まとめ

第Ⅲ部である10章~13章を読みました。10章以外はゲームを作るのとは違って仕様の説明が多く、ちょっと面白みに欠ける内容ですが、後の章で使うのでしょう。第Ⅳ部から関数型プログラミングやマクロが出てくるようなので、楽しみにしています。Webプログラムはよくわからないから別途勉強しないとダメだな。

余談

余談です。

(unwind-protect (/ 1 0)
  (princ "I need to say 'flubyduby' matter what"))

ゼロ除算にコンディションを通知するときに表示するメッセージ。
'flubyduby'ってなんだろうと思ってググったけど見つからず。
辞書で引いたら
flub : へま、しくじり、失敗
dub : 不器用、へたくそ
意訳は「どうしても、しくじり下手くそ野郎という必要があるみたいだね」って感じになるのかな。
matter whatの訳し方がよくわかりませんでした。英語も勉強しなきゃいけないのに放置したまんまだ。ゲェ

追記 5/12
Land Of Lisp 読み進める際のメモとか - キンクリれさんにHTMLのところの直し方書いてあった。