2014-03-15-01-Common Lisp のコンディション機構-2 - project-enigma

2014-03-15-01-Common Lisp のコンディション機構-2

>> Site top >> weblog >> 月別アーカイブ >> 2014年03月のlog >> 2014-03-15-01-Common Lisp のコンディション機構-2

最終更新日付:2014/03/15 23:50:00


Common Lisp のコンディション機構-2

2014 年 03 月 15 日

前回は、コンディションの通知と捕捉だけ書いた。再起動についても書きたいが、今回は前回の補足を先に。

前回はからっぽの divide-by-zero を書いたが、今回は(defclass でいうところの)スロットを追加するところから。前回の define-condition をこう変える。

(define-condition divide-by-zero (error)
  ((arg1 :initarg :arg1
         :reader  divide-by-zero-arg1)
   (arg2 :initarg :arg2
         :reader  divide-by-zero-arg2)))

arg2 は確実にゼロなのだけど、まぁそこはいいや。これによって、test-divide は以下のように書けるようになり、コンディションとともに渡されたパラメータを通知できる。

(defun test-divide (a b)
  (when (zerop b)
    (error 'divide-by-zero :arg1 a :arg2 b))
  (/ a b))

test-driver を修正して、この情報を利用する。とりあえず、以下のように。

(defun test-driver (a b)
  (handler-case (test-divide a b)
    (divide-by-zero (err)
      (format t "WARNING : divide by zero. arg1 = ~A, arg2 = ~A.~%"
              (divide-by-zero-arg1 err) (divide-by-zero-arg2 err))
      :infinite)))

* (test-driver 10 0)
WARNING : divide by zero. arg1 = 10, arg2 = 0.
;  => :infinite

再起動は次回でいいや。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : Common Lisp

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.