<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Sure, sounds good.<div><br></div><div>The (let loop ([vs '()]) ...) is a 'named let' (<a href="http://docs.racket-lang.org/guide/let.html?q=named%20let#(part._.Named_let)">http://docs.racket-lang.org/guide/let.html?q=named%20let#(part._.Named_let)</a>) which as the guide says is equivalent to&nbsp;(letrec ([loop (lambda (vs) ...)])&nbsp;(loop '()) --- so 'loop' is a recursive function that we're using to iterate until (fib) is &gt;= n, accumulating the values in the vs argument. &nbsp;If you're not familiar with letrec, another definition would be</div><div><br></div><div>(define (fib-less-than-n n)</div><div>&nbsp; (define fib (mk-fib))</div><div>&nbsp; (define (loop vs)</div><div>&nbsp; &nbsp; (let ([fib-val (fib)])</div><div>&nbsp; &nbsp; &nbsp; (if (&gt;= fib-val n)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (reverse vs)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (loop (cons fib-val vs)))))</div><div>&nbsp; (loop '()))</div><div><div><div></div></div><blockquote type="cite"><div><div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto; "><div style="word-wrap: break-word; "><div><div><div></div></div></div></div></blockquote></div></div></div></blockquote></div><div><div><div><div class="gmail_quote"></div></div></div><blockquote type="cite"><div><div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto; "><div style="word-wrap: break-word; "><div><div><div></div></div></div></div></blockquote></div></div></div></blockquote></div><div><br></div><div>Thinking of loops as just a form of recursion can be a little strange at first. &nbsp;There's more information in the Racket guide here- <a href="http://docs.racket-lang.org/guide/Lists__Iteration__and_Recursion.html">http://docs.racket-lang.org/guide/Lists__Iteration__and_Recursion.html</a> or another page to check out might be <a href="http://mitpress.mit.edu/sicp/full-text/sicp/book/node15.html">http://mitpress.mit.edu/sicp/full-text/sicp/book/node15.html</a>.&nbsp;</div><div><br></div><div>Hope this helps,</div><div><br></div><div>- Erik</div><div><div><br></div><div><br><div><div>On Feb 14, 2012, at 1:00 AM, Joe Gilray wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Thanks Erik. &nbsp;Very nice! &nbsp;Although I miss the recursion.<div><div><br></div><div>please help me understand how this works, especially&nbsp;(let loop ([vs '()]). What exactly is going on there?</div><div><br></div><div>Thanks again,</div>
<div>-joe<br><br><div class="gmail_quote">On Mon, Feb 13, 2012 at 9:51 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-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto; ">
<div style="word-wrap:break-word">Instead of calling fib-less-than-n recursively, you could add a loop inside, for example something like,<div><br></div><div><div><div><div>(define (fib-less-than-n n)</div><div>&nbsp; (define fib (mk-fib))</div>
<div>&nbsp; (let loop ([vs '()])</div><div>&nbsp; &nbsp; (let ([fib-val (fib)])</div><div class="im"><div>&nbsp; &nbsp; &nbsp; (if (&gt;= fib-val n)</div></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (reverse vs)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (loop (cons fib-val vs))))))</div></div>
</div></div><span class="HOEnZb"><font color="#888888"><div><br></div><div>- Erik</div></font></span><div><div class="h5"><div><br><div><div>On Feb 13, 2012, at 10:41 PM, Joe Gilray wrote:</div><br><blockquote type="cite">
Erik,<div><br></div><div>Intriguing idea and it works "flat", 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>&nbsp; (let ([f1 (mk-fib)])</div>

<div>&nbsp; &nbsp; (let ([fib-val (f1)])</div><div>&nbsp; &nbsp; &nbsp; (if (&gt;= fib-val n) '() (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" target="_blank">eriksilkensen@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

Another option is you could turn change your fib function to be 'mk-fib' that returns a new instance of the fib function each time it's called:<br>
<br>
(define (mk-fib)<br>
<div> &nbsp;(let ([n0 -1] [n1 1])<br>
 &nbsp; &nbsp;(lambda ()<br>
 &nbsp; &nbsp; &nbsp;(let ([next (+ n0 n1)])<br>
 &nbsp; &nbsp; &nbsp; &nbsp;(set! n0 n1)<br>
 &nbsp; &nbsp; &nbsp; &nbsp;(set! n1 next))<br>
 &nbsp; &nbsp; &nbsp;n1)))<br>
<br>
</div>- Erik<br>
<div><div><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" target="_blank">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; &nbsp; (let ([n0 -1] [n1 1])<br>
&gt;&gt; &nbsp; &nbsp; (lambda ()<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; (let ([next (+ n0 n1)])<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; (set! n0 n1)<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; (set! n1 next))<br>
&gt;&gt; &nbsp; &nbsp; &nbsp; n1)))<br>
&gt;<br>
&gt;<br>
&gt; One thing you can do is turn fib into a "sequence", and then from a<br>
&gt; sequence into a stream that knows how to remember its previous values.<br>
&gt;<br>
&gt; Here'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; &nbsp;(let ([n0 -1] [n1 1])<br>
&gt; &nbsp; &nbsp;(lambda ()<br>
&gt; &nbsp; &nbsp; &nbsp;(let ([next (+ n0 n1)])<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp;(set! n0 n1)<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp;(set! n1 next))<br>
&gt; &nbsp; &nbsp; &nbsp;n1)))<br>
&gt;<br>
&gt; (define fib-stream<br>
&gt; &nbsp;;; Here's a sequence of the function:<br>
&gt; &nbsp;(let ([fib-sequence (in-producer fib 'donttellmecauseithurts)])<br>
&gt;<br>
&gt; &nbsp; &nbsp;;; Let's wrap it and turn it into a stream that remembers...<br>
&gt; &nbsp; &nbsp;(sequence-&gt;stream fib-sequence)))<br>
&gt;<br>
&gt;<br>
&gt; ;; Ok, we've got a stream. &nbsp;Let's look at its first few elements.<br>
&gt; (define (peek-fibs n)<br>
&gt; &nbsp;(for ([elt fib-stream]<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp;[i (in-range n)])<br>
&gt; &nbsp; &nbsp;(displayln elt)))<br>
&gt;<br>
&gt; (peek-fibs 10)<br>
&gt; (printf "-----\n")<br>
&gt; (peek-fibs 20)<br>
&gt; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br>
&gt;<br>
</div></div>&gt; ____________________<br>
&gt; &nbsp;Racket Users list:<br>
&gt; &nbsp;<a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
</blockquote></div><br></div>
</blockquote></div><br></div></div></div></div></blockquote></div><br></div></div>
</blockquote></div><br></div>
</div>
</body></html>