[racket] web server + REPL-ish functions?

From: Matthew Butterick (mb at mbtype.com)
Date: Thu Aug 28 10:45:48 EDT 2014

Maybe starting the server from the REPL is the better idea. Right now I do it through raco (redirecting commands of form `raco pollen ...`, including `raco pollen start`, to a special pollen/raco module that handles them)


On Aug 27, 2014, at 3:12 PM, Jay McCarthy <jay.mccarthy at gmail.com> wrote:

> Yes, although I actually assumed that you would start your server from
> a real Racket REPL, rather than implement your own REPL, so you
> wouldn't need to wait on anything. But what you wrote will work too.
> 
> Jay
> 
> On Wed, Aug 27, 2014 at 4:33 PM, Matthew Butterick <mb at mbtype.com> wrote:
>> Helpful, thanks. I have my `serve/servlet` within a `start-server` function rather than at the top level. Quick experimentation suggests that `thread-wait` is needed in this case (?):
>> 
>> (define (start-server)
>>    (setup-chores ...)
>>    (define server-t (thread (lambda () (serve/servlet ...))))
>>    (define repl-t (thread (lambda () ...)))
>>    (thread-wait server-t))
>> 
>> Otherwise, I'll see how far I get.
>> 
>> 
>> 
>> On Aug 27, 2014, at 10:58 AM, Jay McCarthy <jay.mccarthy at gmail.com> wrote:
>> 
>>> Hi Matthew,
>>> 
>>> You can run serve/servlet in a separate thread and continue to
>>> interact with any functions you want:
>>> 
>>> (define server-t (thread (lambda () (serve/servlet ...))))
>>> 
>>> You could then use something like xrepl to start doing new stuff.
>>> There's nothing the Web server would need to do necessarily.
>>> 
>>> However, if you wanted to change how the server was running, you might
>>> need to adjust some things. For instance, you could put the main
>>> request->response function in a box that you could change. You could
>>> kill the server-t thread and then create another one to restart the
>>> server with new parameters.
>>> 
>>> Is that a useful sketch?
>>> 
>>> Jay
>>> 
>>> 
>>> On Wed, Aug 27, 2014 at 1:33 PM, Matthew Butterick <mb at mbtype.com> wrote:
>>>> The main engine of my Pollen system is a project webserver that's started from the command line, uses serve/servlet, and sends the usual status & error messages to the terminal window.
>>>> 
>>>> I was thinking it would be handy to be able to keep an input prompt in that terminal window to be able to issue commands without stopping the server, switching to another window, etc.
>>>> 
>>>> Is there a straightforward approach to this in terms of program design, or would it introduce annoying complications?
>>>> 
>>>> My understanding of serve/servlet is that it can only do one thing, which is listen & respond to TCP requests on a certain port. So for this REPL-ish feature, there would have to be a separate listenener/response mechanism. Is that something one would accomplish with threads? Or is there a better way? (Or no way.)
>>>> 
>>>> An approach I've seen with other web-development systems is to put an admin panel in the browser (by injecting it into the HTML of the output web page). But that's inherently hinky because it pollutes your output.
>>>> ____________________
>>>> Racket Users list:
>>>> http://lists.racket-lang.org/users
>>> 
>>> 
>>> 
>>> --
>>> Jay McCarthy
>>> http://jeapostrophe.github.io
>>> 
>>>          "Wherefore, be not weary in well-doing,
>>>     for ye are laying the foundation of a great work.
>>> And out of small things proceedeth that which is great."
>>>                         - D&C 64:33
>> 
>> 
>> ____________________
>>  Racket Users list:
>>  http://lists.racket-lang.org/users
> 
> 
> 
> -- 
> Jay McCarthy
> http://jeapostrophe.github.io
> 
>           "Wherefore, be not weary in well-doing,
>      for ye are laying the foundation of a great work.
> And out of small things proceedeth that which is great."
>                          - D&C 64:33



Posted on the users mailing list.