<div dir="ltr">Thank you! I will try that. Sorry for the delayed response. Got caught up in another project.<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Jan 4, 2014 at 9:40 AM, Gustavo Massaccesi <span dir="ltr"><<a href="mailto:gustavo@oma.org.ar" target="_blank">gustavo@oma.org.ar</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">There are more complex closures, that share an external variable. For example:<br>
;-----<br>
#lang racket<br>
(define-values (up! down!)<br>
  (let ()<br>
    (define counter 0)<br>
    (define (up!) (set! counter (add1 counter)) counter)<br>
    (define (down!) (set! counter (sub1 counter)) counter)<br>
    (values up! down!)))<br>
(up!) ;==> 1<br>
(up!) ;==> 2<br>
(down!) ;==> 1<br>
;-----<br>
If you need to send “up!” and “down!” in different interactions but<br>
they nevertheless have to modify the same counter then this problem is<br>
very difficult.<br>
<br>
For some cases, I guess that you can uses something similar to the<br>
“Stateless Servlets”<br>
<a href="http://docs.racket-lang.org/web-server/stateless.html#(part._considerations)" target="_blank">http://docs.racket-lang.org/web-server/stateless.html#(part._considerations)</a><br>
. I didn’t use it, but it can serialize and deserialize functions and<br>
continuations. I don’t know how much transparent are the structures it<br>
use, so I’m not sure if it’s possible to inspect them. I’m not sure<br>
that you can deserialize the continuation in another server, but you<br>
can deserialize it after a server reboot, so I guess it’s possible.<br>
<br>
(And as Neil Toronto said, you should also use sandboxing to avoid<br>
unexpected problems.)<br>
<br>
Gustavo<br>
<br>
<br>
On Fri, Jan 3, 2014 at 5:10 PM, Neil Toronto <<a href="mailto:neil.toronto@gmail.com">neil.toronto@gmail.com</a>> wrote:<br>
> What kind of inspection?<br>
><br>
> If it's for security purposes, you're better off running the procedures in a<br>
> sandbox (see the `racket/sandbox' module). You can even control the amount<br>
> of time something is allowed to run. Also, `serial-lambda' might be<br>
> something you could use, if the sender and receiver are both running the<br>
> same program. (It might work in other circumstances; I don't know.)<br>
><br>
> Neil ⊥<br>
<div class="im HOEnZb">><br>
><br>
> On 01/02/2014 09:41 AM, Alegria Baquero wrote:<br>
>><br>
>> Thank you for your kind responses. Your solutions are good ones but<br>
>> unfortunately don't fit my purpose. Imagine a mobile code scenario where<br>
>> you have no control of the definition of a closure. What I want to do is<br>
>> to be able to print the body of any incoming closure that arrives in a<br>
>> message. So if server A sends server B a closure (lambda () (displayln<br>
>> "hello world")), B could grab that incoming closure and capture it as<br>
>> the string "(lambda () (displayln "hello world"))" so it can be<br>
>> inspected before executing it. Does this make sense? How can I then<br>
>> construct a function procedure->string that transforms at runtime<br>
>> (without using macros) a closure's body to a string?<br>
>><br>
>> Thank you again and happy new year.<br>
>><br>
>> Alegria<br>
>><br>
>><br>
>> On Tue, Dec 31, 2013 at 10:53 AM, Alexander D. Knauth<br>
</div><div class="HOEnZb"><div class="h5">>> <<a href="mailto:alexander@knauth.org">alexander@knauth.org</a> <mailto:<a href="mailto:alexander@knauth.org">alexander@knauth.org</a>>> wrote:<br>
>><br>
>>     Yes, you can do it with a struct with the property prop:procedure.<br>
>><br>
>>     #lang racket<br>
>><br>
>>     (require rackunit)<br>
>><br>
>>     (struct my-proc (proc str)<br>
>>        #:property prop:procedure (struct-field-index proc))<br>
>><br>
>>     (define f<br>
>>        (my-proc  (lambda (x) (+ x 1))<br>
>>                 "(lambda (x) (+ x 1))"))<br>
>><br>
>>     (check-true (procedure? f))<br>
>>     (check-equal? (f 1) 2)<br>
>>     (check-equal? (my-proc-str f)<br>
>>                    "(lambda (x) (+ x 1))")<br>
>><br>
>>     (define-syntax-rule (my-lambda args body ...)<br>
>>        (my-proc                 (lambda args body ...)<br>
>>                 (substring (~v '(lambda args body ...)) 1)))<br>
>><br>
>>     (define f2<br>
>>        (my-lambda (x) (+ x 1)))<br>
>><br>
>>     (check-true (procedure? f2))<br>
>>     (check-equal? (f2 1) 2)<br>
>>     (check-equal? (my-proc-str f2)<br>
>>                    "(lambda (x) (+ x 1))")<br>
>><br>
>><br>
>>     On Dec 29, 2013, at 10:45 PM, Alegria Baquero wrote:<br>
>><br>
>>>     Hello,<br>
>>><br>
>>>     is there any way to transform a function's body to a string such<br>
>>>     as "(lambda(x)...)"?<br>
>>><br>
>>>     Thanks<br>
>>><br>
>>>     Alegria<br>
>>>     ____________________<br>
>>>      Racket Users list:<br>
>>>     <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
>><br>
>><br>
>><br>
>><br>
>><br>
>> --<br>
>><br>
>> ---------------------------------------------------------------------------------------<br>
>> PhD candidate<br>
>> Department of Informatics<br>
>> Donald Bren School of Information and Computer Sciences<br>
>> University of California, Irvine<br>
>><br>
>><br>
>> ____________________<br>
>>    Racket Users list:<br>
>>    <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
>><br>
><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><br clear="all"><br>-- <br><span style="border-collapse:collapse;font-family:arial,sans-serif;font-size:13px">---------------------------------------------------------------------------------------</span><div>
<span style="border-collapse:collapse;font-family:arial,sans-serif;font-size:13px">PhD candidate<br><span style="background-color:rgb(255,255,255)">Department of Informatics<br><span style="color:rgb(34,34,34)">Donald</span> <span style="color:rgb(34,34,34)">Bren</span> School of Information and Computer Sciences<br>
University of Cal</span>ifornia, Irvine</span></div>
</div>