Просмотр 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 и умрет от бесконечно глубокой рекурсии. Я понимаю, как ones
будет печатать бесконечно 1. Я не понимаю, как работает naturalNumbers
.
По моей (явно неправильной) логике, head
Stream
, возвращенный первым вызовом naturalNumbers
, будет равен 1, а следующий элемент в потоке будет оцениваться как ones().add( naturalNumbers() );
, который равен ones().add(1)
, за которым следует ones().add( naturalNumbers() )
, который будет reeavulate до 1
и т.д....
Было бы очень приятно, если бы кто-то пролил свет на это.