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

KMRCLを眺める (21) mean

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

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

これもポール・グレアム氏由来マクロだったような気がしますが、どこに書いてあったか忘れてしまいました。

使われ方は、

(MEAN 1 2 3 4 5 6 7 8 9)
;⇒ 5

という感じで、上記は、

(/ (+ 1 2 3 4 5 6 7 8 9) 9)

と展開されるのでリストの長さを求めるコストをマクロ展開時(大体コンパイル前)にずらせるので実行時は効率的だ、とか、引数のコンス節約だ、とかいう感じでしょうか。

マクロ定義は、

(defmacro mean (&rest args)
  `(/ (+ ,@args) ,(length args)))

というそのままのものです。

CLを触っていると、リード時、マクロ展開時、ロード時、コンパイル時、実行時、等々色々なタイミングでどう評価されるのかを考える機会が増えてややこしい気がするんですが、各々のタイミングで色々いじれるのが楽しいのもまた事実です☺

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20091124