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-17

KMRCLを眺める (15) until

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

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

今回のUNTILからしばらくループ系のマクロが続きます。

UNTILの良い例が思い付かないので例のための例ですが、

(WITH-OPEN-FILE (IN "/etc/motd")
  (LET (LINE ANS)
    (UNTIL (EQ :EOF (SETQ LINE (READ-LINE IN NIL :EOF)))
      (PUSH LINE ANS))
    (NREVERSE ANS)))
;⇒ ("Linux setq 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:05:01 UTC 2009 x86_64"
;   "" "To access official Ubuntu documentation, please visit:"
;   "http://help.ubuntu.com/")

という風に述語がTを返すまでのループを繰り返します。

;;; Loop macros

(defmacro until (test &body body)
  `(do ()
       (,test)
     ,@body))

ちなみに、WHILEと同じくUNTILもCLにはありませんが、このマクロ定義で分かるように、DOはUNTIL系のループです。

UNTILにLETを合体させて変数を更新するようにしたものがDOともいえるでしょうか。

;; DO
(DO ((I 0 (1+ I)))
    ((> I 10))
  (PRINC I))
;⇒ NIL
----------
012345678910

;; UNTIL
(LET ((I 0))
  (UNTIL (> I 10)
    (PRINC I)
    (INCF I)))
;⇒ NIL
----------
012345678910