チャーチ数をつくってみた

SICP問題2.6 を見ていたら書きたくなったので,別の言語で写経してみた.

#!/usr/bin/env perl
# -*- mode: perl; coding: utf8; -*-
use strict;
use warnings;
use Perl6::Say;

my $zero = sub {
    my ($f) = @_;
    sub {
        my ($x) = @_;
        $x;
    };
};

sub add_1 {
    my ($n) = @_;
    sub {
        my ($f) = @_;
        sub {
            my ($x) = @_;
            $f->($n->($f)->($x));
        };
    };
}

my $one = add_1($zero);
my $two = add_1($one);

sub plus ($$) {
    my ($m, $n) = @_;
    sub {
        my ($f) = @_;
        sub {
            my ($x) = @_;
            $m->($f)->($n->($f)->($x));
        };
    };
}

sub display_church ($) {
    my ($n) = @_;
    my $inc = sub {$_[0] + 1};
    $n->($inc)->(0);
}

say "zero = ", display_church($zero);
say "one = ", display_church($one);
say "two = ", display_church($two);
say "(2 + 1) + 2 = ", display_church(plus(add_1($two), $two));

JavaScript は,return が必須だし,function キーワードは長いし.
こういうのを書くときは面倒.
あと括弧大杉.plus() んとことかわけわからん.

(function () {
    var zero = function (f) {
        return function (x) {
            return x;
        };
    };
    function add_1(n) {
        return function (f) {
            return function (x) {
                return f((n(f))(x));
            };
        };
    };
    var one = add_1(zero);
    var two = add_1(one);
    function plus(m, n) {
        return function (f) {
            return function (x) {
                return (m(f))((n(f))(x));
            };
        };
    };
    function display_church(n) {
        function inc(x) {
            return x + 1;
        };
        return (n(inc))(0);
    };
    alert("zero = " + display_church(zero));
    alert("one = " + display_church(one));
    alert("two = " + display_church(two));
    alert("((2 + 1) + 2) = " + display_church(plus(add_1(two), two)));
})();