<div dir="ltr">Oh, I should point one thing that both Eli and I glossed over: there is some sharing between the sandboxed world and the outside world, roughly the racket/base library. This is why, for example, when lists come out of the sandbox, they still appear to be lists. Overall, it is good to minimize such sharing, but being completely unshared is either inconvenient (for things like lists) and impossible (for things like the ability to connect to the underlying operating system -- this comes up more with the windowing portion of the GUI libraries, tho).<div>
<br></div><div>Robby</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Apr 21, 2013 at 8:54 PM, Eli Barzilay <span dir="ltr">&lt;<a href="mailto:eli@barzilay.org" target="_blank">eli@barzilay.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">20 minutes ago, manu d wrote:<br>
&gt; Hello<br>
&gt;<br>
&gt; I am trying to port TryClojure<br>
&gt; (<a href="https://github.com/Raynes/tryclojure" target="_blank">https://github.com/Raynes/tryclojure</a>), a web-based REPL, to Racket.<br>
<br>
</div>Nice!  I wanted to look into that ages ago...  (There&#39;s a whole pile<br>
of additional nice things that can be done with it.)<br>
<div class="im"><br>
<br>
&gt; I would like the tutorial part to be based on Racket&#39;s &#39;Quick&#39;<br>
&gt; tutorial (<a href="http://docs.racket-lang.org/quick/" target="_blank">http://docs.racket-lang.org/quick/</a>)<br>
<br>
</div>Even better!<br>
<div class="im"><br>
<br>
&gt; To do that, I need to evaluate pict expressions, like (circle 10),<br>
&gt; to a string I can return to the browser for rendering.<br>
<br>
</div>Sidenote: to make things easy, it&#39;s probably best to use `data&#39; URLs<br>
-- things like:<br>
<br>
  &lt;img src=&quot;data:image/png;base64,--the-encoding-of-the-image--&quot;&gt;<br>
<div class="im"><br>
<br>
<br>
&gt; Right now, I evaluate the strings coming from the browser with the<br>
&gt; following code:<br>
&gt;<br>
&gt; ;;--------------------------------<br>
&gt;<br>
&gt; (define evaluator<br>
&gt;     (parameterize ([sandbox-output &#39;string]<br>
&gt;                           [sandbox-error-output &#39;string] ...)<br>
&gt;       (call-with-limits #f #f<br>
<br>
</div>Another sidenote: this `call-with-limits&#39; is completely useless...<br>
This is because (a) there are no limits, (b) there&#39;s no need for<br>
limits since the sandbox has that functionality baked it, (c) even if<br>
there was a point, it wraps the sandbox creation rather than uses of<br>
the resulting evaluator.<br>
<br>
<br>
&gt; [...]<br>
<div class="im">&gt; I know I can convert a pict structure like this: (convert a-pict<br>
&gt; &#39;png-bytes) but (evaluator &quot;(circle 10)&quot;) does not evaluate to a<br>
&gt; pict structure, so I can&#39;t use convert here.<br>
<br>
</div>The problem is that the sandboxed world is completely separate from<br>
your code&#39;s world.  You need to share some parts to make it possible<br>
to treat resulting picts in the first as picts in the second.  This is<br>
done with the `sandbox-namespace-specs&#39; parameter.  Here&#39;s a small and<br>
complete working example:<br>
<br>
    #lang at-exp racket<br>
<br>
    (require racket/sandbox file/convertible net/base64 scribble/html)<br>
<br>
    (define specs ; add &#39;slideshow/pict to whatever is there<br>
      (let ([old (sandbox-namespace-specs)])<br>
        (cons (car old) (list* &#39;slideshow/pict (cdr old)))))<br>
<br>
    (define e (parameterize ([sandbox-namespace-specs specs])<br>
                (call-with-trusted-sandbox-configuration<br>
                 (λ () (make-evaluator &#39;slideshow)))))<br>
<br>
    (define (render-img expr)<br>
      @img[src: (list &quot;data:image/jpeg;base64,&quot;<br>
                      (base64-encode (convert (e expr) &#39;png-bytes)))])<br>
<br>
    (define (eval-page expr)<br>
      (output-xml<br>
       @html{@head{@title{Evaluation result}}<br>
             @body{@pre{&gt; @expr<br>
                        @render-img[expr]}}}))<br>
<br>
    (eval-page &quot;(circle 10)&quot;)<br>
<br>
But like Robby said -- it&#39;s better to do the conversion inside the box<br>
to avoid crashing the whole thing because someone just had to try<br>
(circle 1000000).<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:<br>
                    <a href="http://barzilay.org/" target="_blank">http://barzilay.org/</a>                   Maze is Life!<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></blockquote></div><br></div>