無名再帰

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)