node package manager


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 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(- 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(+ 1); // <= Unconditional recursion 
// => Error: Maximum call stack exceeded 
z(function(fn) {
    return function(n) {
        return 100 <= n ? n : fn(+ 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 or in LICENSE