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

KMRCLを眺める (5) awhile

| 17:53 | KMRCLを眺める (5) awhile - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (5) awhile - わだばLisperになる

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

使われ方としては、

(WITH-OPEN-FILE (IN "/etc/passwd")
  (AWHILE (READ-LINE IN NIL)
    (WRITE-LINE IT)))

という感じでしょうか。

(WITH-OPEN-FILE (IN "/etc/passwd")
  (DO ((IT (READ-LINE IN NIL) (READ-LINE IN NIL)))
      ((NOT IT))
    (WRITE-LINE IT)))

という風に展開されます。

自分的には、AWHILEはあまり好きでない系統なのですが、これは便利ですね☺

定義はこんな感じです。

(defmacro awhile (expr &body body)
  `(do ((it ,expr ,expr))
       ((not it))
     ,@body))

これを眺めていて、単純にLETのアナフォリック・マクロ版も割といけるんじゃないかと思いました。

(DEFMACRO ALET (PRED &BODY BODY)
  `(LET ((IT ,PRED))
     (DECLARE (IGNORABLE IT))
     ,@BODY))
(ALET (PROBE-FILE "/etc/passwd")
  IT)
;⇒ #P"/etc/passwd"

このALETで包めば制御構文はなんでもアナフォリック・マクロ的に書けるんじゃないかと思いましたが、中途半端ですね…。

ちなみに、Let Over LambdaのALETとは別ものです。

AWHILEには全然関係のない話ですが、Xyzzyや、Emacs Lispに慣れた人がCLで何か書こうとして遭遇するFAQに「whileがないんだけど…」というのがあります。

CLにはwhileはないんですよね。自作しましょう。

さらに脱線すると、Emacsの繰り返し構文がwhileベースになったのは、GNU Emacs開発当初のマシンは処理能力が貧弱で、その為にシンプルにしたという苦肉の策だったようです。

RMS自身はEmacs Lisp以外(Zetalisp等)では、普通にDOやLOOPを使っていて、whileマクロを定義したりしてはいない様子。