Awesome! That helped a lot. Thanks!<br><br><div class="gmail_quote">On Wed, Mar 21, 2012 at 6:28 PM, Jay McCarthy <span dir="ltr">&lt;<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@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">Since you did not tell us what error you had, I assume the error was:<br>
<br>
serve/servlet: contract violation, expected: can-be-response?, given: #&lt;promise&gt;<br>
<br>
When I tried your code, I also had the error:<br>
<br>
current-directory: `exists&#39; access denied for /home/jay/Downloads/<br>
<br>
because you need to give the sandbox permission to read, like:<br>
<br>
#:allow-read (list &quot;/&quot;)<br>
<br>
But I assume that you know that error doesn&#39;t have to do with the Web server.<br>
<br>
Returning to the serve/servlet error...<br>
<br>
If you change your &#39;start&#39; to:<br>
<br>
(define (start request)<br>
  (define prm ((lazy-eval &#39;lazy-handler) request))<br>
  (printf &quot;~a ~a\n&quot; prm (promise? prm))<br>
  (define ans (force prm))<br>
  (printf &quot;~a\n&quot; ans (promise-forced? prm))<br>
  ans)<br>
<br>
You will see the output:<br>
<br>
#&lt;promise&gt; #f<br>
Servlet (@ /main) exception:<br>
promise-forced?: expected argument of type &lt;promise&gt;; given: #&lt;promise&gt;<br>
<br>
This indicates the thing returned by your handler is not a promise and<br>
therefore cannot be forced.<br>
<br>
This is called structure generativity: every instantiation of a module<br>
has different structures, and sandboxes lead to multiple<br>
instantiations of the same module---racket/promise in this case. Thus,<br>
different &#39;promise&#39; data structures.<br>
<br>
Fixing this is what &#39;sandbox-namespace-specs&#39; is for.<br>
<br>
If you wrap your call to &#39;make-evaluator&#39; in:<br>
<br>
  (parameterize ([sandbox-namespace-specs<br>
                  (list sandbox-make-namespace<br>
                        &#39;racket/promise<br>
                        &#39;web-server/http)])<br>
 .....)<br>
<br>
Then it will work. This shares the modules &#39;racket/promise&#39; (to get<br>
the right promise data structure) and &#39;web-server/http&#39; (to get the<br>
right request and response structures) between the evaluator and the<br>
host Racket program.<br>
<br>
In case you don&#39;t realize, using an evaluator is totally unnecessary.<br>
You can just write another module in the lazy language and require it<br>
in the strict program and call force normally. For example:<br>
<br>
#lang racket/load<br>
<br>
(module lazy-handler lazy<br>
  (require web-server/http/bindings<br>
           web-server/http/response-structs<br>
           web-server/http/xexpr)<br>
<div class="im">  (define (lazy-handler request)<br>
    (let ((bindings (request-bindings request)))<br>
      (if (exists-binding? &#39;hi bindings)<br>
        (response/xexpr &quot;Hi!&quot;)<br>
</div>        (response/xexpr &quot;&quot;))))<br>
  (provide lazy-handler))<br>
<br>
(module the-server racket<br>
  (require web-server/servlet-env<br>
           web-server/http/bindings<br>
           web-server/http/response-structs<br>
           web-server/http/xexpr<br>
           &#39;lazy-handler)<br>
<br>
  (define (start request)<br>
    (define prm (lazy-handler request))<br>
    (printf &quot;~a ~a\n&quot; prm (promise? prm))<br>
    (define ans (force prm))<br>
    (printf &quot;~a ~a\n&quot; ans (promise-forced? prm))<br>
    ans)<br>
<br>
  (serve/servlet start<br>
                 #:launch-browser? #t<br>
<div class="im">                 #:quit? #f<br>
                 #:listen-ip #f<br>
</div>                 #:servlet-path &quot;/main&quot;<br>
<div class="im">                 #:port 8080<br>
                 #:servlet-regexp #rx&quot;main.*&quot;<br>
                 #:extra-files-paths<br>
</div>                 (list (build-path (current-directory)))))<br>
<br>
(require &#39;the-server)<br>
<br>
Hope this helps,<br>
<br>
Jay<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
On Wed, Mar 21, 2012 at 11:44 AM, Nathan Breit &lt;<a href="mailto:nabreit@gmail.com">nabreit@gmail.com</a>&gt; wrote:<br>
&gt; I&#39;m trying to write a servlet that plugs into the existing server. Here&#39;s an<br>
&gt; example:<br>
&gt;<br>
&gt; #lang racket<br>
&gt; (require web-server/servlet-env)<br>
&gt; (require web-server/http/bindings)<br>
&gt; (require web-server/http/response-structs)<br>
&gt; (require web-server/http/xexpr)<br>
&gt;<br>
&gt; (require racket/sandbox)<br>
&gt; (define lazy-eval (make-evaluator &#39;lazy))<br>
&gt;<br>
&gt; (map lazy-eval<br>
&gt;      &#39;(<br>
&gt;        (require web-server/http/bindings)<br>
&gt;        (require web-server/http/response-structs)<br>
&gt;        (require web-server/http/xexpr)<br>
&gt;        (require racket/promise)<br>
&gt;        (define (lazy-handler request)<br>
&gt;          (let ((bindings (request-bindings request)))<br>
&gt;            (if (exists-binding? &#39;hi bindings)<br>
&gt;                (response/xexpr &quot;Hi!&quot;)<br>
&gt;                &quot;&quot;)))<br>
&gt;        ))<br>
&gt;<br>
&gt; (define (start request)<br>
&gt;   (force ((lazy-eval &#39;lazy-handler)<br>
&gt;           request)))<br>
&gt;<br>
&gt; (serve/servlet start<br>
&gt;                #:launch-browser? #f<br>
&gt;                #:quit? #f<br>
&gt;                #:listen-ip #f<br>
&gt;                #:servlet-path &quot;&quot;<br>
&gt;                #:port 8080<br>
&gt;                #:servlet-regexp #rx&quot;main.*&quot;<br>
&gt;                #:extra-files-paths<br>
&gt;                (list (build-path (current-directory) &quot;extraFiles&quot;)))<br>
&gt;<br>
&gt; On Wed, Mar 21, 2012 at 6:22 AM, Matthias Felleisen &lt;<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Mar 21, 2012, at 5:18 AM, Nathan Breit wrote:<br>
&gt;&gt;<br>
&gt;&gt; &gt; Hi,<br>
&gt;&gt; &gt; I&#39;m trying to implement a Racket web-server handler that does lazy<br>
&gt;&gt; &gt; evaluation. My approach so far as been to try making a evaluator/namespace<br>
&gt;&gt; &gt; that uses the lazy racket, then evaluate a function in it that returns a<br>
&gt;&gt; &gt; lazy request handler. However, I&#39;m running into problems getting the handler<br>
&gt;&gt; &gt; to read the request object. My last resort will be to make a request<br>
&gt;&gt; &gt; serializer and pass serialized requests into the handler, but is there a<br>
&gt;&gt; &gt; better way?<br>
&gt;&gt; &gt; Thanks,<br>
&gt;&gt; &gt; -Nathan<br>
&gt;&gt; &gt; ____________________<br>
&gt;&gt; &gt;  Racket Users list:<br>
&gt;&gt; &gt;  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Are you trying to write a web server in Lazy or are you trying to write a<br>
&gt;&gt; servlet in Lazy and plug it into the existing strict server? Perhaps you<br>
&gt;&gt; want to post a code snippet that shows where things fail. -- Matthias<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&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>
&gt;<br>
<br>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
Jay McCarthy &lt;<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>&gt;<br>
Assistant Professor / Brigham Young University<br>
<a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
<br>
&quot;The glory of God is Intelligence&quot; - D&amp;C 93<br>
</font></span></blockquote></div><br>