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

KMRCLを眺める (16) while

| 23:49 | KMRCLを眺める (16) while - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (16) while - わだばLisperになる

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

WHILEにについては、AWHILEのときに書いてしまったのですが、Emacs Lisp/XyzzyにあってCLにない代表的なマクロかと思います。

使用例としては、

(WITH-OPEN-FILE (IN "/etc/motd")
  (LET (LINE ANS)
    (WHILE (SETQ LINE (READ-LINE IN NIL NIL))
      (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/")

こんな感じでしょうか。

定義は、

(defmacro while (test &body body)
  `(do ()
       ((not ,test))
     ,@body))

みたいな感じです。

CLの人からはあまり「WHILE欲しいなあ」という声は聞かないのですが、多分似たようなことは、LOOPで簡潔に書けてしまうからではないかと想像しています。

上のWHILEの例は、

(WITH-OPEN-FILE (IN "/etc/motd")
  (LOOP :FOR LINE := (READ-LINE IN NIL NIL) :WHILE LINE
        :COLLECT LINE))
;⇒ ("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/")

のように書けます。