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-10-31

KMRCLを眺める (3) aif

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

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

AIFはOn Lispでもお馴染のPaul Graham氏作のマクロの中でも、最も有名なものじゃないかと思います。

アナフォリック・マクロの代表という感じですが、アイデアは単純で、テストの結果をitという名前の変数に束縛するというものです。

名前は、Anaphoric IFの略。

使われ方としては、

(AIF (PROBE-FILE "/etc/passwd")
     IT
     (ERROR "No such file or directory"))
;=> #P"/etc/passwd"

みたいな感じでしょうか。

定義はこんな感じです。

;; Anaphoric macros

(defmacro aif (test then &optional else)
  `(let ((it ,test))
     (if it ,then ,else)))

testの内容をitに束縛してるというそのままな内容ですね。

利用上の注意としては、便利だからといってマクロを書くのにAIFを使ったりすると知らぬ間にitが内部で参照できるようなマクロができてしまったりするので、明確な意図がない限りはそういう目的には使わない方が良いのではないかと思います。まあ、当たり前ですね☺