Просматривая Hacker News , и я наткнулся на http://streamjs.org/ , который является реализация коллекции с отложенной оценкой в Javascript.
Один из примеров:
function ones() {
return new Stream( 1, ones );
}
function naturalNumbers() {
return new Stream(
// the natural numbers are the stream whose first element is 1...
1,
function () {
// and the rest are the natural numbers all incremented by one
// which is obtained by adding the stream of natural numbers...
// 1, 2, 3, 4, 5, ...
// to the infinite stream of ones...
// 1, 1, 1, 1, 1, ...
// yielding...
// 2, 3, 4, 5, 6, ...
// which indeed are the REST of the natural numbers after one
return ones().add( naturalNumbers() );
}
);
}
naturalNumbers().take( 5 ).print(); // prints 1, 2, 3, 4, 5
Возможно, уже слишком поздно, и я упускаю суть, но я не понимаю, как это печатает 1,2,3,4,5. Я ожидал, что он напечатает 1,2,2,2,2 и умрет от бесконечно глубокой рекурсии. Я понимаю, как один
напечатает бесконечное число 1. Я не понимаю, как работает naturalNumbers
.
По моей (очевидно неправильной) логике, head
Stream
, возвращенный первым вызовом naturalNumbers
, будет равен 1, а следующий элемент в поток оценивается как единиц (). add (naturalNumbers ());
, что составляет единиц (). add (1)
, за которым следует единиц (). add (naturalNumbers ())
, который будет преобразован в 1
и так далее ...
Был бы очень признателен, если бы кто-нибудь пролил свет на это.