<br><br><div class="gmail_quote">On Tue, Feb 9, 2010 at 12:23 PM, james pack <span dir="ltr">&lt;<a href="mailto:jamestidwellpack@gmail.com" target="_blank">jamestidwellpack@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">

Hi,<br>
<br>
I&#39;m trying to create a function that returns a function, here&#39;s the<br>
code<br>
<br>
(define (make-getter pattern url-string)<br>
  (lambda (keyword)<br>
    (regexp-match* pattern<br>
                    (get-html-page (force url-string)))))<br>
<br>
(define get (make-getter<br>
                                        #rx&quot;&lt;h2 class=r&gt;([0-9]+)\&quot;&quot;<br>
                                         (delay (string-append &quot;http://<br>
<a href="http://www.google.com/custom?hl=en&amp;sitesearchq=" target="_blank">www.google.com/custom?hl=en&amp;sitesearchq=</a>&quot; keyword &quot;&amp;btnG=Search&quot;))))<br>
<br>
(get &quot;cat&quot;)<br>
<br>
<br>
What I want the make-getter function to do is return a function that<br>
will take an argument but since the returned function itself is<br>
dependent on the argument (keyword), i&#39;m getting an error saying that<br>
the keyword is undefined. </blockquote><div><br></div><div>Actually, the returned function, as you&#39;ve written it, isn&#39;t dependent on the argument.  make-getter is returning a lambda expression that binds, but doesn&#39;t use, the keyword argument.  Instead, you&#39;re trying to use keyword in a place where it isn&#39;t bound.</div>

<div><br></div><div>You probably want something like:</div><div><br></div><div><span style="font-family:arial, sans-serif;font-size:13px;border-collapse:collapse">(define (make-getter pattern make-url-string)<br>
 (lambda (keyword)<br>   (regexp-match* pattern<br>                   (get-html-page (make-url-string keyword)))))</span></div><div><font face="arial, sans-serif"><span style="border-collapse:collapse"><br>
</span></font></div><div><font face="arial, sans-serif"><span style="border-collapse:collapse"><span style="font-size:13px">(define get (make-getter<br>
                                       #rx&quot;&lt;h2 class=r&gt;([0-9]+)\&quot;&quot;<br>                                        (lambda (keyword) (string-append &quot;http://<br><a href="http://www.google.com/custom?hl=en&amp;sitesearchq=" style="color:rgb(64, 100, 128)" target="_blank">www.google.com/custom?hl=en&amp;sitesearchq=</a>&quot; keyword &quot;&amp;btnG=Search&quot;))))</span></span></font></div>

<div><font face="arial, sans-serif"><span style="border-collapse:collapse"><br></span></font></div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

I thought using delayed evaluation would<br>
make the code work but it didn&#39;t.<br><br></blockquote><div><br></div><div>Lazy evaluation doesn&#39;t violate lexical scope (and that&#39;s a good thing).  In other words, *when* the expression is evaluated has nothing to do with the binding environment in which it&#39;s evaluated.  The latter is determined by inspecting the syntax of the program, rather than by trying to trace its run-time behavior.</div>

<div><br></div><div> -Jon</div><div><br></div></div>