[racket] Efficiency of tight loops in Racket

From: David Herman (dherman at ccs.neu.edu)
Date: Fri Jan 14 13:33:46 EST 2011

Here's an idea for a project (maybe for a motivated undergrad?): a Racket sub-language that, like Node.js:

- restricts you to only non-blocking I/O
- restricts you not to have access to Racket threads
- uses the control-flow model of JS where a single event loop invokes only one user callback at a time
- provides Node.js-like API's

but *also* uses send/suspend and friends to allow writing event handlers in direct style. That's something JS just can't do, since it doesn't have first-class continuations.

An even more ambitious student might even play with doing this in a variant of Typed Racket with an effect system, where you distinguish functions that might suspend their continuation from functions that won't, as well as effect-polymorphic higher-order functions such as map and for-each. This would make it possible to write expressive server programs where it's nonetheless still statically detectable where all the possible points of pre-emption are. This makes it easier to reason about shared state, since only calling suspendable functions can trigger a pre-emption.

IOW: JS control-flow model + send/suspend + Typed Racket + "suspendability" effect.

Dave

On Jan 14, 2011, at 9:40 AM, Neil Van Dyke wrote:

> Eli Barzilay wrote at 01/14/2011 09:21 AM:
>> 
>> 9 hours ago, David Nolen wrote:
>>   
>>> With a good FFI it seems like someone could write a great Racket DSL for evented network programming a la Node.js minus all the JS callback cruft.
>>>     
>> 
>> I know very little about it, but it looks like it covers stuff that racket includes as built in functionality.
>>   
> 
> Yeah, I don't know Node.js, but most of "http://nodejs.org/api.html" looks like ways to make JavaScript more easily do things that Racket already does better than Node.js does.
> 
> Regarding event-driven API like I see in the documentation for Node.js "net.Server" documentation, you could implement that in pure Racket pretty easily, without needing FFI.
> 
> I've done some fairly high-performance I/O for TCP and interactive subprocess pipes in pure Racket.  Racket's own event conception, buffer operations, and multithreading have been up to the task.  Of course, Racket certainly lets you implement simpler abstractions like Node.js's atop this.  You can even make Racket special-syntax like "define-Node.js-like-server-and-with-some-static-checking". :)
> 
> -- 
> http://www.neilvandyke.org/
> _________________________________________________
>  For list-related administrative tasks:
>  http://lists.racket-lang.org/listinfo/users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20110114/922a1de2/attachment.html>

Posted on the users mailing list.