京急大師線徒歩

今日は特にどこにも行かない予定だったのですが、晴れていたので昼から川崎大師にお参りに行くことにしました。ついでなので、京急大師線を歩きました。駅間が狭いのは楽しくていいですね。空気はとてつもなく悪かったですけど。
昼 14 時前から夕方 16 時前までの約 2 時間。線路の距離で 4.5 km 、道のりだと 6.2 km くらいでした (川崎大師に寄ったり工事の迂回があったりしたので長め) 。

Ruby で内包表記

日本 Ruby 会議 2007 - Log0610-S5
RubyKaigi でみんな感動したと噂の Dave Thomas さんの講演のログ。やっぱり内容自体はどうでもよくて、ここが気になりました。

たとえば list comprehension がほしい。

Haskell の内包表記 (内包表現) とか確かにかっこいいけれど、Ruby の文法に Haskell の内包表記の文法を入れるのは明らかに無理だし、Python みたいな文法 ([x**2 for x in range(10)] みたいなの) は勘弁して欲しいですよね。それに、今の Ruby でも (ネタの範疇なら) 似たようなことができそう。そこで、以下のようなコードが動くようなものを作ってみました。

# [ x^2 | x <- [0..10] ] みたいなもの
p list{ x ** 2 }.where{ x.in(0..10) }
  #=> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# [ [x, y] | x <- [0..2], y <- [0..2], x <= y ] みたいなもの
p list{ [ x, y ] }.where{ x.in(0..2); y.in(0..2); x <= y }
  #=> [[0, 0], [0, 1], [0, 2], [1, 1], [1, 2], [2, 2]]

# sieve (x:xs) = x:sieve [ y | y <- xs, y `mod` x /= 0 ] みたいなもの
def sieve(x, *xs)
	ys = list{ y }.where{ y.in(xs); y % x != 0 }
	[x] + (ys.empty? ? [] : sieve(*ys))
end
p sieve(*(2..50))
  #=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

where より when のが適切? あと、やっぱり内包表記は無限リストがないとあんまり生きてこない気がします。
以下コード。

続きを読む