01:00:47 [potix2'in]
01:03:54 [potix2'out] ; Read error: Connection reset by peer
01:33:38 [g000001'out] ; *.net *.split
01:33:38 [ksmakoto__'out] ; *.net *.split
01:33:38 [PECCU'out] ; *.net *.split
01:33:38 [r_takaishi_'out] ; *.net *.split
01:33:38 [usaturn'out] ; *.net *.split
01:33:38 [kaela_lisp_schem'out] ; Ping timeout: 257 seconds
20:10:26 [kaela_lisp_schem'in]
20:10:47 <g000011> ロガーが死んでたw
20:11:03 <g000011> また一日空いてしまいましたが、Successful Lisp / David B. Lamkinsを読
20:11:03 <g000011> む、の続きです
20:11:08 <g000011> ((( Chapter 9 - Introducing Error Handling and Non-Local Exits )))
20:11:57 <g000011> ksmakotoさん: 「可視範囲」「生存期間」ってのは分かりやすいですね。エクステントの訳語で、「生存期間」ってのは、たまにみかける気はします
20:12:15 <g000011> (((( UNWIND-PROTECT: When it absolutely, positively has to run ))))
20:12:41 <g000011> http://psg.com/~dlamkins/sl/chapter09.html
20:13:14 <g000011> この章はCLでのエラーハンドリングの話です
20:20:16 <g000011> ファイルや何かリソースを開く場合、使い終わったら必ずリソースを解放する必要がありますが、途中でエラーに遭遇して中断してしまったり、ユーザーが割り込みを掛けたりして
20:20:30 <g000011> しまうことがあります
20:21:08 <g000011> こういう場合、きちんと解放する処理をしないと、開きっぱなしになってしまうのですが、
20:21:59 <g000011> unwind-protectは、こういう必ずしなければならないリソースの解放の処理のような処理を掛くのに使います
20:22:16 <g000011> rubyでいうと、block - rescue - endみたいなところです
20:23:05 <g000011> (unwind-protect 本体処理 クリーンアップ処理)という風に書くのも大体同じような感じです
20:24:12 <g000011> (((( Gracious exits with BLOCK and RETURN-FROM ))))
20:24:55 <g000011> blockとreturn-fromは、非局所脱出のための構文です
20:25:25 <g000011> Introducing Error Handling and Non-Local Exits と書いてるし、この章はエラーハンドリングだけじゃなかったですね
20:27:24 <g000011> (block 名前 ... (return-from 名前 値))という風に使いますが、他の言語にも普通にある機構です
20:27:57 <g000011> ネストしても使えます。
20:28:18 <g000011> 組み込みの構文では、(return 値)というのが使えることが多いのですが、
20:28:47 <g000011> (return-from nil 値)というものの略記として、(return ...)が使えます
20:29:11 <g000011> つまり、組み込みの構文でreturnが使えるものは、(block nil...)で囲まれている、ということですね
20:37:46 <g000011> blockのタグのスコープは、レキシカルという説明がありますが、
20:38:18 <g000011> ですが、無限エクステントではないので、blockの外からは見えませんね
20:38:41 <g000011> まあ、Schemeでもやってない限り、この辺りに引っ掛かかる人もいないと思いますが…
20:38:51 <g000011> (((( Escape from anywhere (but not at any time) with CATCH and THROW ))))
20:40:44 <g000011> 今度はcatchとthrowの話です
20:41:51 <g000011> catchとthrowは動的で、タグも動的なので
20:43:47 <g000011> 脱出は、実行時に作られる入れ子の状態に沿って行なわれます
20:45:04 <g000011> テキストの例では、関数呼び出しで作られる入れ子で
20:45:27 <g000011> 任意の層に飛び出してみせる例を説明したりしています
20:47:43 <g000011> CLでは、そんなにcatch&throwは直に手書きすることはないですが、
20:47:57 <g000011> elispだとcatch&throwしかないので良く見掛けるかもしれません
20:48:05 <g000011> (((( Making sure files only stay open as long as needed ))))
20:48:46 <usaturn> c⌒っ*^-^)っφ メモメモ...
20:50:01 <g000011> ファイルをオープンするような処理には、前出のunwind-protectを使うという説明がありましたが、リソースの確保→解放というパターンを抽象化してマクロにした場合には、with-なんとかという名前が付くことが多いです
20:50:12 <g000011> その代表例として、with-open-fileの説明があります
20:50:49 <g000011> (with-open-file (ストリーム ファイル オプション) 本体処理)とだけ書けば、
20:52:01 <g000011> 本体を抜けたら自動でストリームは閉じられます。中身は、unwind-protectで作られているので、割り込みやエラーがあっても閉じる処理はされます
20:53:51 <g000011> こういうunwind-protectをまとめたマクロは、with-という名前にするというのは、割と作法みたいなところがあります
20:55:03 <g000011> Schemeでもwith-系はこういうリソースを扱うものが多いですが、
20:56:07 <g000011> より関数が主体なので、まず関数で構成して、それを使いやすくラッピングして、with-系のマクロにしていることが多いようです
20:57:23 <g000011> rubyとか、Smalltalkだと、ブロックで色々やって、そのブロックを抜けるとリソースが解放される、というような仕組みですが、Schemeは、そういう書法にちょっと近い気もします
20:57:37 <g000011> CLの場合は、unwind-protectでベタっと書きます
20:58:16 <g000011> が、SBCLの内部の実装や、slimeではscheme風に書いてることが割とあります(恐らく書いている人の趣味で)
20:59:20 <g000011> なにかメリットがあるのかもしれませんが、自分はいまいち分かってないので、メリットを知っている方がいたら教えて欲しいです
21:00:55 <g000011> 良く分かってないですが、スレッドとかその辺りが絡むと違ってきたりするんでしょうか
21:02:10 <g000011> というところで、エラーハンドリングと、非局所脱出はここまでで、明日は、10章からです
21:03:08 [g000011'out] ; Quit: (quit)
23:38:01 <usaturn> おつかれさまでしたー