2007年 11月 28日

Ruby1.9 のラムダさん

やばいやばい。知らなかった。手元で既に使えるシンタックスっていう! (でも将来使えるかわからない予感) id:secondlife さんに教えてもらった。id:secondlife++ あと parse.y をながめてやりかたを覚えたw

この前の true/false のラムダを書いてみる。

# curry は http://subtech.g.hatena.ne.jp/cho45/20071119/1195420784

# 1.8
t = lambda {|x, y| x }.curry
f = lambda {|x, y| y }.curry

t[lambda {
	puts "hoge"
}][lambda {
	puts "fuga"
}][]

#1.9 head
t = -> (x, y) { x }.curry
f = -> (x, y) { y }.curry

t[-> {
	puts "hoge"
}
][-> {
	puts "fuga"
}][]

# or
t.
(-> {
	puts "hoge"
}).
(-> {
	puts "fuga"
}).()

やばすぎる萌えすぎる。


メモ

t = -> (x, y) { x }
t = -> x, y { x }   # 括弧いらないらしい

(1..3).map {|x| x * x }
(1..3).map(&-> x { x * x }) # このつかいかたはあんましなそう?
(1..3).map &-> x { x * x }  # おなじ

car = -> x,*xs { x }
cdr = -> x,*xs { xs }
p car[10, 20, 30] #=> 10
p cdr[10, 20, 30] #=> [20, 30]

car = -> ((x,*xs)) { x }
cdr = -> ((x,*xs)) { xs }
p car.([10, 20, 30]) #=> 10
p cdr.([10, 20, 30]) #=> [20, 30]

どういうとき一番うれしいかなぁ。ラムダ計算のやつは普通書かないし

hoge = ->&b{ b.yield b }

hoge.() {|x|
	p x.lambda? #=> false
}

hoge.(&->x{
	p x.lambda? #=> true
})

これ記法によって挙動が変えられるってことで夢ひろがりんぐだけど、実際変わるメソッドがあったりするとびびりそう。どういう意図で入ってるんだろう。