Требуется объяснение примера функциональной отложенной оценки Javascript

Просматривая 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 и так далее ...

Был бы очень признателен, если бы кто-нибудь пролил свет на это.

10
задан mu is too short 11 September 2011 в 23:12
поделиться