<div dir="ltr">Thanks Robby and Eli<div><br></div><div style>I now have the following, to convert a value inside the sandbox:</div><div style><div><br></div><div><div>;;------------------------------------------------</div>
</div><div><br></div><div><div>#lang racket</div><div>(require racket/sandbox)</div><div><br></div><div>(define evaluator</div><div>  (parameterize ([sandbox-output &#39;string]</div><div>                 [sandbox-error-output &#39;string]</div>
<div>                 [sandbox-path-permissions &#39;((exists #rx#&quot;&quot;)</div><div>                                                          (read #rx#&quot;&quot;))])</div><div>    (call-with-trusted-sandbox-configuration</div>
<div>     (lambda () </div><div>       (make-evaluator &#39;slideshow</div><div>                       #:requires &#39;(file/convertible</div><div>                                      net/base64))))))</div><div><br></div>
<div><br></div><div>(define (run-code ev str)</div><div>  (define exp</div><div>    (parameterize </div><div>        ([current-input-port (open-input-string str)])</div><div>      `(let ([e ,(read)])</div><div>         (if (convertible? e)</div>
<div>             (base64-encode (convert e &#39;png-bytes) #&quot;&quot;)</div><div>             e))))</div><div>  (define res (ev exp))</div><div>  (define out (get-output ev))</div><div>  (define err (get-error-output ev))</div>
<div>  (list res out err))</div><div><br></div><div>(run-code evaluator &quot;(circle 10)&quot;)</div></div><div><br></div><div>;;------------------------------------------------</div><div><br></div><div style>To add the conversion code to the expressions coming from the browser, I do the following</div>
<div style><br></div><div style><div>(define exp</div><div>    (parameterize </div><div>        ([current-input-port (open-input-string str)])</div><div>      `(let ([e ,(read)])</div><div>         (if (convertible? e)</div>
<div>             (base64-encode (convert e &#39;png-bytes) #&quot;&quot;)</div><div>             e))))</div><div><br></div><div style><br></div><div style>Would this work ?</div><div><br></div><div style>Thank you</div><div style>
<br></div><div style>Manu</div></div><div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Apr 22, 2013 at 1:43 PM, Robby Findler <span dir="ltr">&lt;<a href="mailto:robby@eecs.northwestern.edu" target="_blank">robby@eecs.northwestern.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I think the issue you&#39;re seeing is that you&#39;ve instantiated two copies of slideshow/pict (as in the example program below), one inside the sandbox and one outside so the functions on picts from the outside don&#39;t work on picts that are produced by code inside.<div>

<br></div><div>I think that probably the right fix is to add some code to expressions that are evaluated that does the translation inside the sandbox (so very big picts turn into out of memory errors inside the sandbox instead of outside, for example). </div>

<div><br></div><div>Robby</div><div><br></div><div><div>#lang racket</div><div>(require racket/sandbox)</div><div class="im"><div>(define evaluator</div><div>  (parameterize ([sandbox-output &#39;string]</div><div>
                 [sandbox-error-output &#39;string]</div></div><div>                 [sandbox-path-permissions &#39;((exists #rx#&quot;&quot;)</div><div>                                             (read #rx#&quot;&quot;))])</div>
<div class="im">
<div>    (call-with-limits #f #f</div><div>                      (lambda () (make-evaluator &#39;slideshow)))))</div><div><br></div><div><br></div><div>(define (run-code ev str)</div><div>  (define res (ev str))</div><div>

  (define out (get-output ev))</div><div>  (define err (get-error-output ev))</div><div>  (list res out err))</div><div><br></div></div><div>(require slideshow/pict)</div><div><br></div><div>(define not-an-outside-pict (run-code evaluator (format &quot;~s&quot; &#39;(circle 10))))</div>

<div>(pict? not-an-outside-pict)</div><div><br></div><div>(run-code evaluator (format &quot;~s&quot; &#39;(pict? (circle 10))))</div><div><br></div></div><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
<div><div class="h5">
On Sun, Apr 21, 2013 at 8:26 PM, manu d <span dir="ltr">&lt;<a href="mailto:th3rac25@gmail.com" target="_blank">th3rac25@gmail.com</a>&gt;</span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div class="h5">
<div dir="ltr">Hello<div><br></div><div>I am trying to port TryClojure (<a href="https://github.com/Raynes/tryclojure" target="_blank">https://github.com/Raynes/tryclojure</a>), a web-based REPL, to Racket.</div><div><br>

I would like the tutorial part to be based on Racket&#39;s &#39;Quick&#39; tutorial (<a href="http://docs.racket-lang.org/quick/" target="_blank">http://docs.racket-lang.org/quick/</a>)<br>
</div><div><br></div><div>To do that, I need to evaluate pict expressions, like (circle 10), to a string I can return to the browser for rendering.</div><div><div><br></div><div>Right now, I evaluate the strings coming from the browser with the following code:</div>


<div><br></div><div><div>;;--------------------------------</div><div><br></div></div><div><div><div>(define evaluator</div><div>    (parameterize ([sandbox-output &#39;string]</div><div>                          [sandbox-error-output &#39;string] ...)</div>


<div>      (call-with-limits #f #f</div><div>                        (lambda () (make-evaluator &#39;slideshow)))))</div></div><div><br></div><div><br></div><div>(define (run-code ev str)</div><div>  (define res (ev str))</div>


<div>  (define out (get-output ev))</div><div>  (define err (get-error-output ev))</div><div>  (list res out err))</div></div><div><br></div><div>;;--------------------------------</div><div><br></div><div>I know I can convert a pict structure like this: (convert a-pict &#39;png-bytes)</div>


<div>but (evaluator &quot;(circle 10)&quot;) does not evaluate to a pict structure, so I can&#39;t use convert here.</div><div><br></div><div>I also cannot see how to use bitmap% save-file method here, because I cannot get my hands on the bitmap object<br>


</div></div><div><br></div><div>Is there a way to parameterize how picts are rendered so I can end up with a PNG bytestring ?</div><div><br></div><div>Thank you</div><span><font color="#888888"><div><br></div>
<div>Manu</div>
<div><br></div><div><br></div><div><br></div></font></span></div>
<br></div></div>____________________<br>
  Racket Users list:<br>
  <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>