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 |

2010-09-26

KMRCLを眺める(206) RANDOM-CHOICE

| 22:39 | KMRCLを眺める(206) RANDOM-CHOICE - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(206) RANDOM-CHOICE - わだばLisperになる

今回は、KMRCLのrandom.lispからRANDOM-CHOICEです。

使い方は、マクロ展開してみると分かりやすいですが、

(kl:random-choice 1 2 3 4 5)
;%=>
(CASE (RANDOM 5)
  (0 1)
  (1 2)
  (2 3)
  (3 4)
  (4 5))

となっていて、引数の式をランダムに選択して実行するというのが良くわかります。

定義は、

(defmacro random-choice (&rest exprs)
  `(case (random ,(length exprs))
     ,@(let ((key -1))
         (mapcar #'(lambda (expr)
                     `(,(incf key) ,expr))
                 exprs))))

となっています。

MAPCARの中で副作用のあるINCFしてるのがちょっと気持ち悪い…という人もいそうです。

自分なら

(defmacro random-choice (&rest exprs)
  `(case (random ,(length exprs))
     ,@(loop :for i :from 0
             :for e :in exprs
             :collect (list i e))))

みたいに書くかもしれません。まあ、Schemeではなくて、CLの話なので趣味の問題ではありますが…。