Version: 0.1.1
Master build:
Develop build:
This library provides a utility function to support the creation of self-referencing anonymous functions.
It can be installed in whichever way you prefer, but I recommend NPM.
The Z Combinator is the same, in principle, as the Y Combinator except it works in languages with applicative (eager) order of execution (arguments are evaluated before the function call) just like JavaScript.
For more information about the Z Combinator please read Fixed-point Combinators on Wikipedia or the brief mention in Douglas Crockford's "The Little JavaScripter".
var z = require('z-combinator');
// Factorial
var factorial = z(function(fn) {
return function(n) {
return 2 >= n ? n : n * fn(n - 1);
}
});
factorial(2) // => 2
factorial(3) // => 6
factorial(4) // => 24
factorial(5) // => 120
Just as you would with any other recursive function, make sure you include some sort of break condition. If you miss it out, the function will recur indefinitely.
var z = require('z-combinator');
z(function(fn) {
return function(n) {
return fn(n + 1); // <= Unconditional recursion
};
})(0);
// => Error: Maximum call stack exceeded
z(function(fn) {
return function(n) {
return 100 <= n ? n : fn(n + 1); // <= Conditional recursion
};
})(0);
// => 100
I accept contributions to the source via Pull Request, but passing unit tests must be included before it will be considered for merge.
$ make install
$ make tests
If you have Vagrant installed, you can build the dev environment to assist development.
The repository will be mounted in /srv
.
$ vagrant up
$ vagrant ssh
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)
$ cd /srv
The content of this library is released under the MIT License by Andrew Lawson.
You can find a copy of this license at http://www.opensource.org/licenses/mit or in LICENSE