Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-06-11

Getting Started in *LISP (26)

| 22:39 | Getting Started in *LISP (26) - わだばLisperになる を含むブックマーク はてなブックマーク - Getting Started in *LISP (26) - わだばLisperになる

今回は、4.2章 Error Messages です。

4.2 Error Messages

エラーについては、警告の場合と同じように様々ある

> (pront 'oops!)
>>Error: The function PRONT is undefined.
SYMBOL-FUNCTION:
   Required arg 0 (S): PRONT
:C  0: Try evaluating #'PRONT again
:A  1: Abort to Lisp Top Level
->

というようなタイプミスにより引き起こされたものから、

> (/!! 3 0)
>>Error: In interpreted /!!.
	The result of a (two argument) float /!! overflowed.
	There are 8192 selected processors,
	8192 processors have an error.
	A SINGLE-FLOAT temporary pvar stored at location 458752
	caused the error.
*LISP-I::/!!-2:
...
:A  : Abort to Lisp Top Level
->

不正な引数を与えて起きたエラー等々。

エラーメッセージがConnection Machineっぽくて良いですね。

4.2.1 Recovering from Errors

エラーから(デバッガから)の復帰は、Lucid CLならば、:a(abort)でOKとのこと。

When You Abort, Remember to (*warm-boot)

しかし、*Lispの場合、Connection Machineとフロントエンドのマシンの二つのマシンを使っているので、フロントエンド側が復帰していてもConnection Machineがうまく復帰していない場合がある。

こういう場合には、

(*warm-boot)

を使う。

(*warm-boot)はConnection Machineの内部状態をリセットし、その他の細々としたことを整えてくれるとのこと。

デバッガから抜けた際には、Connection Machine内が色々と混乱した状態になっている場合もあり、エラーにならない筈のコードもエラーになったりするかもしれない。

> (*sum 1)	;; NOTE: This example was run on an 8K CM
8192

> (*when (evenp!! (self-address!!)) (break))
>>Break: break
EVAL:
 Required arg 0 (EXPRESSION): (*WHEN (EVENP!! (SELF...
:C	0: Return from Break
:A	1: Abort to Lisp Top Level
-> :a
Abort to Lisp Top Level

> (*sum 1)
4096

こんなことになったりするらしい。

ちなみに、シミュレーターでも同じようなことになりました。

上記の例は、(evenp!! (self-address!!))で半分のプロセッサを除外している状態で、BREAK→Abortとしたため、プロセッサが半分しか選択されていない状態が残ってしまっているためらしい。

こういうときには、(*warm-boot)して復帰させる

(*warm-boot)

(*sum 1)
;⇒ 8192
For More Persistent Errors, Try (*cold-boot)

(*warm-boot)しても直らないようなときには、一歩進んで(*cold-boot)する。

(*cold-boot)は(*warm-boot)よりもやりなおし度合いが深い。

また、エラーが永続的なpvarに起因するのではないか、と思われるときは、

(*cold-boot :undefine-all t)

を実行してみると良いとのこと。

:undefine-all tは、すべてのVPセットと、pvarを初期化する。

この初期化に伴い作成したプログラムは再ロードする必要があるかもしれない。

上記の対処方法を試しても謎のエラーがしつこく出る場合は、システム管理者に相談しましょう、とのこと。

次回、4.3から再開です。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20100611