[Haskell-cafe] Haskell RPC

Bjorn Bringert bringert at cs.chalmers.se
Mon May 29 21:35:39 EDT 2006

On May 25, 2006, at 11:00 AM, Joel Reymont wrote:

> Folks,
> I'm curious about how the following bit of Lisp code would  
> translate to Haskell. This is my implementation of Lisp RPC and it  
> basically sends strings around, printed "readably" and read on the  
> other end by the Lisp reader. If I have a list '(1 2) it prints as  
> "(1 2)" and becomes '(1 2) again when read on the other end.
> I'm wrote a couple of macros to make the job of defining the RPC  
> easier. def-remote-class defines the main (server) class as well as  
> the client (proxy) class.
> def-remote-method creates the server method as well as a proxy  
> method that sends data over and possibly waits for results and  
> returns them (depending on the :async or :sync qualifier). My Lisp  
> RPC code runs on top of UDP, looks good and works well. I have a  
> soft spot for Haskell in my heart, though, so I wonder how I would  
> go about implementing the same architecture in Haskell.
> This is an example from my test harness:
> (define-test remote-basic
>   (def-remote-class remote (server) ())
>   (def-remote-method sum :sync ((self remote) (a fixnum) (b integer))
>                      (declare (ignorable ip port))
>                      (+ a b seqnum))
>   (let* ((port (+ 1000 (random 50000)))
>          (server (make-instance 'remote
>                                 :port port))
>          (client (make-instance 'remote-proxy
>                                 :host (host-address)
>                                 :port port)))
>     (assert-equal '(6) (sum client 1 2 :seqnum 3))
>     (stop server)
>     (stop client)
>     ))
> I think I can send Haskell code over the wire to be read on the  
> other side just like I do with Lisp. The part that baffles me is  
> being able to provide an interface that lets one easily define  
> remote classes and methods.
> I totally hate Template Haskell because I find it incomprehensible  
> and I'm not going to compare it to Lisp macros. Is there a way to  
> do it without TH?
> Also, it seems to me that the only way to deal with variable  
> numbers of differently typed arguments is to use the HList approach  
> which is quite heavy machinery, IMO.
> Any suggestions?
> 	Thanks, Joel
> P.S. The Haskell Cafe has been a bit quiet lately so I do mean to  
> stir it up some. I think this example shows the advantage of  
> dynamically-typed languages.  I'm also genuinely interested in  
> possible Haskell solutions.

Hi Joel,

the attached example is a simple RPC library. It uses show and read  
for serialization, and some type class tricks to allow functions with  
different arities. This is essentially the HaXR (http:// 
www.haskell.org/haxr/) API, but without the XML, HTTP and error  
reporting stuff.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: simplerpc.hs
Type: application/octet-stream
Size: 2188 bytes
Desc: not available
Url : http://www.haskell.org//pipermail/haskell-cafe/attachments/20060529/8ba93e1d/simplerpc.obj

More information about the Haskell-Cafe mailing list