yoyojs
v0.0.2
Published
A tiny trampoline library.
Downloads
7
Maintainers
Readme
Yoyo
Yoyo is a tiny trampoline (iteratively invokes thunk-returning functions) library with partial application support.
Install
Available via bower:
bower install yoyo
Available via npm:
npm install yoyojs
Usage
Factorial example:
var yoyo = require('yoyojs');
function factorial(n, acc) {
if (n < 2) {
return acc;
}
return fac.bind(null, n-1, n * acc);
}
yoyo(factorial, 3,1); // 6
yoyo(factorial)(3,1); // 6
yoyo(factorial)(3)(1); // 6
Is even/odd example:
var yoyo = require('yoyojs');
function even(n) {
return n === 0 ? true : odd.bind(null, n - 1);
}
function odd(n) {
return n === 0 ? false : even.bind(null, n - 1);
}
yoyo(even, 2); // true
yoyo(even)(2); // true
Why
Without trampolining, a new stack frame is created on each iteration call and thus overflowing the maximum call stack size:
function fac(n, acc) {
if (n < 2) {
return acc;
}
return fac(n-1, n * acc);
}
fac(30000, 1);
Failures:
1) Yoyo Should return fail with stackoverflow
Message:
RangeError: Maximum call stack size exceeded
Stacktrace:
undefined
With trampolining, there is not a new stack created because of tail-call elimation, meaning that after each iteration the result is returned and the trampoline takes care of calling it again with the new result if the returned result is thunk:
function fac(n, acc) {
if (n < 2) {
return acc;
}
return fac.bind(n-1, n * acc);
}
yoyo(fac(30000, 1));
Infinity
For large values, you can use the BigInteger library.
Test
npm test
Credits
JavaScript Allongé by Reg "Raganwald" Braithwaite.
License
Released under the MIT License.