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

KMRCLを眺める (9) aif2

| 01:04 | KMRCLを眺める (9) aif2 - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (9) aif2 - わだばLisperになる

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

何故かEXPORTされてないようなので、使う時にはEXPORTしましょう。

(そういえば、前回のALAMBDAのSELFもEXPORTされてませんでした…)

AIF2の2とは、多値(2値)を受け取れるIFという意味で、GETHASHなどと組み合せて使えます。

(LET ((HT (MAKE-HASH-TABLE)))
  (SYMBOL-MACROLET ((HT-FOO (GETHASH :FOO HT)))
    (SETF HT-FOO NIL)
    
    (AIF2 HT-FOO
          (SETF HT-FOO (LIST 42 IT))
          (SETF HT-FOO 0))
    HT-FOO))
;⇒ (42 NIL)
;   T

どの辺りが有用なのかを上のコードで説明すると、GETHASHで:FOOをキーにして値をNILに設定していますが、通常のIFだとNILの値が返ってきたのか、要素が見付からないのでNILが返ってきたのかが、1値目しか見えないため判定できません。

こういう場合に2値目も見てくれるAIF2が便利というわけです。

この説明だとアナフォリックな面はどうなんだということになってしまうのですが、ITが使えればもっと便利でしょう、多分。

定義はこんな感じです。

(defmacro aif2 (test &optional then else)
  (let ((win (gensym)))
    `(multiple-value-bind (it ,win) ,test
       (if (or it ,win) ,then ,else))))

ちなみにアナフォリックでないIF2もCLiki: fare-utilsなどで提供されています