Erik,<div><br></div><div>Intriguing idea and it works &quot;flat&quot;, but if I write the following I end up with an infinite loop:</div><div><br></div><div><div>(define (fib-less-than-n n)</div><div>  (let ([f1 (mk-fib)])</div>
<div>    (let ([fib-val (f1)])</div><div>      (if (&gt;= fib-val n) &#39;() (cons fib-val (fib-less-than-n n))))))</div><div><br></div>How would I use your idea in this case?</div><div><br></div><div>thanks!</div><div>-joe</div>
<div><br><div class="gmail_quote">On Mon, Feb 13, 2012 at 9:18 PM, Erik Silkensen <span dir="ltr">&lt;<a href="mailto:eriksilkensen@gmail.com">eriksilkensen@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Another option is you could turn change your fib function to be &#39;mk-fib&#39; that returns a new instance of the fib function each time it&#39;s called:<br>
<br>
(define (mk-fib)<br>
<div class="im">  (let ([n0 -1] [n1 1])<br>
    (lambda ()<br>
      (let ([next (+ n0 n1)])<br>
        (set! n0 n1)<br>
        (set! n1 next))<br>
      n1)))<br>
<br>
</div>- Erik<br>
<div><div class="h5"><br>
On Feb 13, 2012, at 10:10 PM, Danny Yoo wrote:<br>
<br>
&gt; On Mon, Feb 13, 2012 at 11:52 PM, Joe Gilray &lt;<a href="mailto:jgilray@gmail.com">jgilray@gmail.com</a>&gt; wrote:<br>
&gt;&gt; Warning: extreme newbie question ahead.<br>
&gt;&gt;<br>
&gt;&gt; I wrote the following fibonacci function:<br>
&gt;&gt;<br>
&gt;&gt; ; function that returns the next fibonacci number each time it is called<br>
&gt;&gt; ; invoke as (fib)<br>
&gt;&gt; (define fib<br>
&gt;&gt;   (let ([n0 -1] [n1 1])<br>
&gt;&gt;     (lambda ()<br>
&gt;&gt;       (let ([next (+ n0 n1)])<br>
&gt;&gt;         (set! n0 n1)<br>
&gt;&gt;         (set! n1 next))<br>
&gt;&gt;       n1)))<br>
&gt;<br>
&gt;<br>
&gt; One thing you can do is turn fib into a &quot;sequence&quot;, and then from a<br>
&gt; sequence into a stream that knows how to remember its previous values.<br>
&gt;<br>
&gt; Here&#39;s what it might look like:<br>
&gt;<br>
&gt; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
&gt; #lang racket<br>
&gt; (require racket/sequence)<br>
&gt;<br>
&gt; (define fib<br>
&gt;  (let ([n0 -1] [n1 1])<br>
&gt;    (lambda ()<br>
&gt;      (let ([next (+ n0 n1)])<br>
&gt;        (set! n0 n1)<br>
&gt;        (set! n1 next))<br>
&gt;      n1)))<br>
&gt;<br>
&gt; (define fib-stream<br>
&gt;  ;; Here&#39;s a sequence of the function:<br>
&gt;  (let ([fib-sequence (in-producer fib &#39;donttellmecauseithurts)])<br>
&gt;<br>
&gt;    ;; Let&#39;s wrap it and turn it into a stream that remembers...<br>
&gt;    (sequence-&gt;stream fib-sequence)))<br>
&gt;<br>
&gt;<br>
&gt; ;; Ok, we&#39;ve got a stream.  Let&#39;s look at its first few elements.<br>
&gt; (define (peek-fibs n)<br>
&gt;  (for ([elt fib-stream]<br>
&gt;        [i (in-range n)])<br>
&gt;    (displayln elt)))<br>
&gt;<br>
&gt; (peek-fibs 10)<br>
&gt; (printf &quot;-----\n&quot;)<br>
&gt; (peek-fibs 20)<br>
&gt; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
&gt;<br>
</div></div>&gt; ____________________<br>
&gt;  Racket Users list:<br>
&gt;  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
</blockquote></div><br></div>