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 |

2009-11-11

KMRCLを眺める (11) awhile2

| 22:37 | KMRCLを眺める (11) awhile2 - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (11) awhile2 - わだばLisperになる

今日は、KMRCLのmacros.lispの中からAWHILE2です。

これもEXPORTされてないようなので、使う時にはEXPORTしましょう。

AIF2のWHILE版なのですが、どこで使えるか例を考えるのが大変です。

ハッシュテーブルから見付かっている間だけループを回すという

(DEFPARAMETER *HT* (CH-UTIL:MAKE-HASH-TABLE-FROM-PLIST (ALEXANDRIA:IOTA 20)))

(LET ((KEY 0))
  (AWHILE2 (GETHASH (INCF KEY 2) *HT*)
    (PRINT (LIST :KEY KEY :VAL IT))))
;=> NIL
----------
;⇒(:KEY 2 :VAL 3) 
;  (:KEY 4 :VAL 5) 
;  (:KEY 6 :VAL 7) 
;  (:KEY 8 :VAL 9) 
;  (:KEY 10 :VAL 11) 
;  (:KEY 12 :VAL 13) 
;  (:KEY 14 :VAL 15) 
;  (:KEY 16 :VAL 17) 
;  (:KEY 18 :VAL 19) 

というものを無理矢理こじつけてみましたが、こんな局面はほぼないですし、あったとしてもAWHILE2は使わない気が。

定義はこんな感じです。

(defmacro awhile2 (test &body body)
  (let ((flag (gensym)))
    `(let ((,flag t))
       (while ,flag
         (aif2 ,test
               (progn ,@body)
               (setq ,flag nil))))))

AIF2系統がEXPORTされてない理由もなんとなく分かってきた気がします…。