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-10-18

KMRCLを眺める(216) WITH-TIMEOUT

| 20:27 | KMRCLを眺める(216) WITH-TIMEOUT - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(216) WITH-TIMEOUT - わだばLisperになる

今回はKMRCLのprocesses.lispから、WITH-TIMEOUTです。

指定された時間中でボディの中身を実行し、タイムアウトになったら中止する、というものです。

定義は、

(defmacro with-timeout ((seconds) &body body)
  #+allegro
  `(mp:with-timeout (,seconds) ,@body)
  #+cmu
  `(mp:with-timeout (,seconds) ,@body)
  #+sb-thread
  `(sb-ext:with-timeout ,seconds ,@body)
  #+openmcl
  `(ccl:process-wait-with-timeout "waiting"
                                 (* ,seconds ccl:*ticks-per-second*)
                                 #'(lambda ()
                                     ,@body) nil)
  #-(or allegro cmu sb-thread openmcl)
  `(progn ,@body)に
  )

となっています。

Allegro CL等では、

;; Allegro CL
(defvar *out* #. *standard-output*)

(kl::with-timeout (3)
  (loop :for i :from 0
        :do (format *out* "Hello ~D~%" i)
            (sleep 2)))
;→ Hello 0
;→ Hello 1
;⇒ NIL

というように上手く動きますが、SBCLだとTIMEOUTというコンディションを発生させるので、

;; SBCL
(handler-case 
    (kl::with-timeout (3)
      (loop :for i :from 0
            :do (format *out* "Hello ~D~%" i)
                (sleep 2)))
  (sb-ext:timeout () "時既に時間切れ"))
;→ Hello 0
;→ Hello 1
;⇒ "時既に時間切れ"

と書くようです。

これが書かれた当時は、SBCLもAllegro CLのように書けたのか、最初から統一されていないのかは謎です。