, экспрессирующие Y в течение срока лыжно-комбинаторов в JavaScript

Я вошел с коминкаторами в JavaScript и гордился (надеюсь) Получение S для работы, когда я наткнулся на Википедию, говоря: «У комбинатора Y можно выразить в лыжном исчислении как: y = s (k (sii)) (s (s (ks) k) (k (sii)))) «Так что мне пришлось попробовать это:

var I = function (x) {
            return x;
        };

var K = function (x) {
        return function(){
            return x;}
        };

var S = function (x) {
           return function (y) {
               return function (z) {
                   return x(z)(y(z));
               }
           }
       };

var Y = S (K(S(I)(I))) (S(S(K(S))(K)) (K(S(I)(I))));

Y;    //evals to:
//function (z) {return x(z)(y(z));}

//And this (lifted from Crockford's Site):
var factorial = Y(function (fac) {
    return function (n) {
        return n <= 2 ? n : n * fac(n - 1);
    };
});    //fails:
//RangeError: Maximum call stack size exceeded

Что я делаю не так? Я не переводю это выражение правильно? Есть ли что-то не так с тем, как я собираюсь по этому поводу? Это даже имеет смысл? Большая часть того, что должно быть Читайте о вещах, как это, просто заставляет мой мозг хотеть взорваться, поэтому точка этого упражнения для меня было главным образом, чтобы посмотреть, понял ли я нотацию (и, таким образом, смогут перевести его на JavaScript).

О, и, кстати: что заставило меня читать и возобновить снова, было то, что прототип. Джей реализует как прототип. Кто-нибудь заметил?

6
задан Timm Schäffner 23 September 2011 в 20:06
поделиться