無名再帰
http://d.hatena.ne.jp/sumim/20080501/p1の続き。
GST
[:n| n < 2 ifTrue: [ n ] ifFalse: [ n * ((BlockClosure block: thisContext method) value: n - 1) ] ] value: 10
ContextPart>>#receiverがなぜかnilを返すのでこういう形に。
Groovy
{ n -> n < 2 ? n : n * {owner}()(n - 1) }(10)
ownerで外側のクロージャを取得。
- +
{ n -> n < 2 ? n : n * call(n - 1) }(10)
callでいいらしい。
Io
block(n, if(n < 2, n, n * call activated call(n - 1))) call(10)
Xtal
(|n| n < 2 ? n : n * callee(n - 1))(10)