[plt-scheme] eval-string namespace

From: Robby Findler (robby at cs.uchicago.edu)
Date: Wed Jul 30 16:55:40 EDT 2003

Another approach would be put to put the expression into the context of
a module which has the imports you care about. Something like this:

  (define (evaluate-string str)
    (let ([sexp (read (open-input-string str))])
      (eval `(module from-wire mzscheme
               (require ...)
               ,sexp))))

another approach would be to pre-define the protocol you expect over
the wire and just interpret each sexpression according to that
protocol. This would probably have some security advantages.

Robby

At Wed, 30 Jul 2003 16:23:08 +0000, "Saint Katsmall T. Wise, Esquire" wrote:
> ------------------------------------------------------------------------------
> Your problem in this example is that call-it is only provided from 
> caller to test. test has to provide it again if it wants it to find its 
> way to the top level.
> 
> Methinks that eval-string, like eval, works with current-namespace. You 
> can create a new namespace (not sure what function does that) and put 
> call-it in the environment using (eval `(define call-it ,call-it)). Then 
> you would be able to call call-it even if it is not in the top level.
> 
> Yours,
> Katsmall T. Wise, Esquire
> 
> 
> Paulo Jorge de Oliveira Cantante de Matos wrote:
> 
> >  For list-related administrative tasks:
> >  http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> >
> >Hi again,
> >
> >Ok, my situation seems now to be even worse.
> >I've provided all my functions, still I'm not able to call them from
> >toplevel. Check the following simple example:
> >caller.scm:
> >(module caller mzscheme
> >  
> >  (require "test.scm")
> >  
> >  (define (call-it)
> >    (bar))
> >  
> >  (provide call-it))
> >
> >test.scm:
> >(module test mzscheme
> >  
> >  (require (lib "string.ss"))
> >  
> >  (define (foo)
> >    (eval-string (read-line)))
> >  
> >  (define (bar)
> >    (display "Done"))
> >  
> >  (provide foo bar))
> >
> >Now I execute caller.scm:
> >  
> >
> >>(require "caller.scm")
> >>(call-it)
> >>    
> >>
> >(bar)
> >
> >. . reference to undefined identifier: bar
> >
> >
> >Why can't I call bar if they are on toplevel (since I provided them)?
> >Can't foo and bar be inside a module for me to call them?
> >
> >Best regards,
> >
> >Paulo Matos
> >
> >  
> >
> >>From: Robby Findler <robby at cs.uchicago.edu>
> >>To: Paulo Jorge de Oliveira Cantante de Matos <pocm at mega.ist.utl.pt>
> >>Cc: PLT Scheme ML <plt-scheme at list.cs.brown.edu>
> >>Subject: Re: [plt-scheme] eval-string namespace
> >>Date: Tue, 29 Jul 2003 16:24:20 -0500
> >>
> >>When you provide bar, the `require' is putting bar into the toplevel
> >>namespace. Also, when you call eval-string, that code will refer to the
> >>toplevel namespace. If you don't provide bar, then it won't be in the
> >>toplevel namespace, so the eval-string won't find it.
> >>
> >>The point here is that `eval-string' is not lexically sensitive in any
> >>way. It always compiles free identifiers in the input expression to
> >>refer to the toplevel -- not the place where the eval-string was
> >>called.
> >>
> >>Robby
> >>
> >>At 29 Jul 2003 22:15:29 +0000, Paulo Jorge de Oliveira Cantante de
> >>Matos wrote:
> >>    
> >>
> >>>  For list-related administrative tasks:
> >>>  http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> >>>
> >>>Hi all,
> >>>
> >>>Check the following:
> >>>(module test mzscheme
> >>>  
> >>>  (require (lib "string.ss"))
> >>>  
> >>>  (define (foo)
> >>>    (eval-string (read-line)))
> >>>  
> >>>  (define (bar)
> >>>    (display "Done"))
> >>>  
> >>>  (provide foo))
> >>>
> >>>If I run this, require test.scm and enter bar for read-line I get
> >>>      
> >>>
> >that
> >  
> >
> >>>bar is undefined. But it'll work alright if I provide bar. Why? 
> >>>I don't understand this behaviour, it's definitely not what I
> >>>      
> >>>
> >expected.
> >  
> >
> >>>In the manual there is no mention to this situation, which is I might
> >>>say strange and boring since I have in the module 20 functions that
> >>>      
> >>>
> >can
> >  
> >
> >>>be called through eval-string that I don't want to provide.
> >>>
> >>>Any suggestions?
> >>>
> >>>Best regards,
> >>>
> >>>Paulo J. Matos
> >>>
> >>>
> >>>      
> >>>
> >
> >
> >
> >  
> >
> 
> ------------------------------------------------------------------------------
> Your problem in this example is that call-it is only provided from caller to test. test has to provide it again if it wants it to 
> find its way to the top level.
> Methinks that eval-string, like eval, works with current-namespace. You can create a new namespace (not sure what 
> function does that) and put call-it in the environment using (eval `(define call-it ,call-it)). Then you would be able to call 
> call-it even if it is not in the top level.
> Yours,
> Katsmall T. Wise, Esquire
> Paulo Jorge de Oliveira Cantante de Matos wrote:
> 
>   For list-related administrative tasks:
> 
>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> 
> 
> 
> Hi again,
> 
> 
> 
> Ok, my situation seems now to be even worse.
> 
> I've provided all my functions, still I'm not able to call them from
> 
> toplevel. Check the following simple example:
> 
> caller.scm:
> 
> (module caller mzscheme
> 
>   
> 
>   (require "test.scm")
> 
>   
> 
>   (define (call-it)
> 
>     (bar))
> 
>   
> 
>   (provide call-it))
> 
> 
> 
> test.scm:
> 
> (module test mzscheme
> 
>   
> 
>   (require (lib "string.ss"))
> 
>   
> 
>   (define (foo)
> 
>     (eval-string (read-line)))
> 
>   
> 
>   (define (bar)
> 
>     (display "Done"))
> 
>   
> 
>   (provide foo bar))
> 
> 
> 
> Now I execute caller.scm:
> 
>   
> 
> (require "caller.scm")
> 
> (call-it)
> 
>     
> 
> (bar)
> 
> 
> 
> . . reference to undefined identifier: bar
> 
> 
> 
> 
> 
> Why can't I call bar if they are on toplevel (since I provided them)?
> 
> Can't foo and bar be inside a module for me to call them?
> 
> 
> 
> Best regards,
> 
> 
> 
> Paulo Matos
> 
> 
> 
>   
> 
> From: Robby Findler <robby at cs.uchicago.edu>
> 
> To: Paulo Jorge de Oliveira Cantante de Matos <pocm at mega.ist.utl.pt>
> 
> Cc: PLT Scheme ML <plt-scheme at list.cs.brown.edu>
> 
> Subject: Re: [plt-scheme] eval-string namespace
> 
> Date: Tue, 29 Jul 2003 16:24:20 -0500
> 
> 
> 
> When you provide bar, the `require' is putting bar into the toplevel
> 
> namespace. Also, when you call eval-string, that code will refer to the
> 
> toplevel namespace. If you don't provide bar, then it won't be in the
> 
> toplevel namespace, so the eval-string won't find it.
> 
> 
> 
> The point here is that `eval-string' is not lexically sensitive in any
> 
> way. It always compiles free identifiers in the input expression to
> 
> refer to the toplevel -- not the place where the eval-string was
> 
> called.
> 
> 
> 
> Robby
> 
> 
> 
> At 29 Jul 2003 22:15:29 +0000, Paulo Jorge de Oliveira Cantante de
> 
> Matos wrote:
> 
>     
> 
>   For list-related administrative tasks:
> 
>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
> 
> 
> 
> Hi all,
> 
> 
> 
> Check the following:
> 
> (module test mzscheme
> 
>   
> 
>   (require (lib "string.ss"))
> 
>   
> 
>   (define (foo)
> 
>     (eval-string (read-line)))
> 
>   
> 
>   (define (bar)
> 
>     (display "Done"))
> 
>   
> 
>   (provide foo))
> 
> 
> 
> If I run this, require test.scm and enter bar for read-line I get
> 
>       
> 
> that
> 
>   
> 
> bar is undefined. But it'll work alright if I provide bar. Why? 
> 
> I don't understand this behaviour, it's definitely not what I
> 
>       
> 
> expected.
> 
>   
> 
> In the manual there is no mention to this situation, which is I might
> 
> say strange and boring since I have in the module 20 functions that
> 
>       
> 
> can
> 
>   
> 
> be called through eval-string that I don't want to provide.
> 
> 
> 
> Any suggestions?
> 
> 
> 
> Best regards,
> 
> 
> 
> Paulo J. Matos
> 
> 
> 
> 
> 
>       
> 
> 
> 
> 
> 
> 
>   
> 
> ------------------------------------------------------------------------------



Posted on the users mailing list.