Z Combinator for self-referencing anonymous functions
JavaScript Ruby
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Z Combinator

Z Combinator

Version: 0.1.1
Master build: Master branch build status
Develop build: Master branch build status

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".

Basic usage

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

Beware of infinite recursion!

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
// => Error: Maximum call stack exceeded

z(function(fn) {
    return function(n) {
        return 100 <= n ? n : fn(n + 1); // <= Conditional recursion
// => 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