00:01:33 [g000024'in]
00:03:14 <g000024> 今日も Successful Lisp / David B. Lamkins ぼっち読書会やります
00:03:31 <g000024> 今日は23章からです
00:03:32 <g000024> http://psg.com/~dlamkins/sl/chapter23.html
00:03:39 <g000024> (((Chapter 23 - To Err is Expected; To Recover, Divine)))
00:03:49 <g000024> 23章が若干長いのでしんどいです
00:04:35 <g000024> コンディションシステムの話のようですが、Common Lisp版try/catchみたいなものです
00:04:49 <g000024> ((((Signal your own errors and impress your users))))
00:08:09 <g000024> まずは、単純にerrorの簡単な説明です
00:08:20 <g000024> ((((Categorize errors using Conditions))))
00:15:59 <g000024> これまで説明してきたerrorの様なエラーが起きたことを通知する以外にも、何か通知したいことは沢山ありますが、このあたりを汎用的にしたものがCommon Lispのコンディションシステムで
00:16:38 <g000024> define-conditionでCLOSのクラスを定義するように階層的にコンディションを構成することが可能なことが説明されています
00:20:29 <g000024> コンディションはCLOSのクラスと同じく、スロットを持っていて、ほぼ同じような感覚でプログラミングできます。CLOSでmake-instanceのところは、make-conditionです
00:20:38 <g000024> ((((Recover from Conditions using Restarts))))
00:26:24 [potix2'in]
00:29:59 <g000024> エラーを通知した後で、ユーザーに継続の選択肢をきくようなことも可能ですが、これには、cerrorを使います
00:31:40 <g000024> 似たようなものに、assertがあり、これは入力をチェックして、問題があれば継続可能なエラーを通知して、の繰り返しに特化している感じのものです
00:34:48 <g000024> 任意のシグナルを通知し、また、任意のシグナルをトラップするには、signalとhandler-bindの組み合わせがプリミティブなものですが、これらの説明です
00:36:47 <g000024> 次にsignalとhandler-bindの組み合わせだと、トラップして終わりなので、
00:37:18 <g000024> cerrorと、restart-bindで継続可能な選択肢を提示して再開する方法の説明があります
00:37:27 <g000024> この辺りになると結構複雑です
00:39:53 <g000024> 次に、エラーを無視する、ignore-errorsの説明
00:42:42 <g000024> ignore-errorsはエラーに遭遇すると、nilを返しますが、多値を返し、2値目にコンディションが返ってくるので、エラーが起っても継続しつつ、これを有効活用する例が紹介されています
00:43:31 <g000024> 割と単純に握り潰すことが多い気がするので、なるほどという例ですね
00:45:08 <g000024> というところで、23章は終わりです。CLの機能でもコンディションシステムは強力という話はあるのですが、
00:45:18 <g000024> 折角なので活用したいところですね
00:45:39 <g000024> 次回は24章からです
00:45:51 [g000024'out] ; Quit: ERC Version 5.1.2 $Revision: 1.796.2.4 $ (IRC client for Emacs)
04:39:39 [potix2'out] ; Remote host closed the connection
08:11:16 [usaturn'in]
15:18:31 [potix2'in]
22:08:54 [potix2'out] ; Remote host closed the connection
22:11:38 [potix2'in]