Miałem do czynienia z kominiarkami w JavaScript i byłem dumny z (miejmy nadzieję), że S zadziałało, gdy natknąłem się na Wikipedię, mówiąc: "Kombinator Y można wyrazić w SKI- rachunek jako: Y = S (K (SII)) (S (S (KS) K) (K (SII)))”, więc musiałem spróbować:Wyrażanie Y w terminach kombinatorów SKI w JavaScript
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
Co robię źle? Czy nie tłumaczę poprawnie tego wyrażenia? Czy coś jest nie tak z tym, jak to robię? Czy to ma nawet sens? Większość tego, co można przeczytać o takich rzeczach, po prostu sprawia, że mój mózg chce eksplodować, więc celem tego ćwiczenia było przede wszystkim sprawdzenie, czy rozumiem notację (a zatem będę w stanie przetłumaczyć ją na JavaScript).
Aha, a przy okazji: co sprawiło, że przeczytałem: & Fiddling ponownie to, co prototype.js implementuje jako Prototype.K jest faktycznie I combinator. Czy ktoś zauważył?
Hah. +1 za to, że mój Firefox powiedział "zbyt wiele rekursji". –