Hatena::Groupcadr

kozima の日記

2010-03-27

loop でうまく書けないこと

| 21:22

こんなような loop が書きたいなー,と思うことが時々ありますが書けなくて悲しい。

(loop for x in list and i from 0
  if (a-test-which-often-returns-false x)
  as y = (a-very-slow-function x)
  collect (compute-the-result i y) and do (a-dirty-stuff y))

やりたいことは

  • リストの要素 x とそのインデックス i について
  • たまにしか成立しないある条件を満たすときに
  • 実行に時間のかかる計算をして
  • その結果からさらに計算して得られる値をリストに格納しつつ
  • ついでに最適化のためのごちゃごちゃした処理もする

で,自然に書くと上のようにしたくなるんですけど,as は if の後に書けないので怒られます。

しょうがないので

(loop for x in list and i from 0
  if (a-test-which-often-returns-false x)
  collect (let ((y (a-very-slow-function x)))
	    (a-dirty-stuff y)
	    (compute-the-result i y)))

とか,なんかいまいちだなーと思いながら書くわけです。