SpiderMonkey がタコなのか、はたまた私の JavaScript力がたんに足りないだけなのか、いずれにしてもかなりひどいことになってしまっていますが、JavaScript で許されている範囲で件の Squeak Smalltalk ならではの「斜め」を実現しようとすると、こんなふうになります。まあ、Smalltalk は読めない…という方に、雰囲気だけでもお伝えできればと。
function fib(n) { function fib1(n, a, b) { if(n>1) fib2(n-1, a, b); var my = arguments.callee; var mine = a+b; var caller = my.caller; var k = 3; while (caller && --k) { caller.arguments[k] = mine; caller = caller.caller } return a+b } function fib2(n, a, b) { if(n>1) fib3(n-1, a, b); var my = arguments.callee; var mine = a+b; var caller = my.caller; var k = 3; while (caller && --k) { caller.arguments[k] = mine; caller = caller.caller } return a+b } function fib3(n, a, b) { if(n>1) fib1(n-1, a, b); var my = arguments.callee; var mine = a+b; var caller = my.caller; var k = 3; while (caller && --k) { caller.arguments[k] = mine; caller = caller.caller } return a+b } return fib1(n, 0, 1) }
追記:
id:edvakfさんが、すっきりと書き直してくださいました。