[Haskell-cafe] Haskell RPC
Robert Dockins
robdockins at fastmail.fm
Thu May 25 15:34:26 EDT 2006
On May 25, 2006, at 2:25 PM, Jason Dagit wrote:
> On 5/25/06, Joel Reymont <joelr1 at gmail.com> wrote:
>
>> 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 won't comment on the difference between haskell and lisp (both
> languages I respect), but I will say that you should add a macro or
> high order function (depneding on lisp vs. haskell) that is something
> like "(with-client (c args-list) body)", that way you can simplify
> the creation/cleanup of clients. Same idea as with-open-file. You can
> do the same with server.
>
> As for your actual question, there is a deriving(Read), but I don't
> remember what extensions are needed.
None. 'deriving' for Read and Show are both Haskell 98. It won't
work for functions though. Haskell functions, unlike in lisp/scheme,
are "opaque". If all you want to do is send data around, then you
can surely use Read/Show, or some of the more efficient workalikes
from DrIFT (http://repetae.net/~john/computer/haskell/DrIFT/).
Joel Raymont:
> 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?
If you want to deliver source code to be executed elsewhere, you can
use hs-plugins or the GHC API (in GHC HEAD branch). Check out the
lambdabot for inspiration (http://haskell.org/haskellwiki/
Lambdabot). Or you could maybe do something interesting here with
YHC bytecode. If you instead want to go the XML-RPC route there's
HaXR (http://www.haskell.org/haxr/).
I can understand the sentiment about TH, but it's probably the only
way to get a similar interface to the lisp one, short of
preprocessing/code generation.
Beyond that, I'd say there are a few too many free variables in the
problem description. What would be the design goals and non-goals
for such an RPC mechanism? What problems prompted the original lisp
implementation? What about fault tolerance, reliability, security? etc.
Rob Dockins
Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
-- TMBG
More information about the Haskell-Cafe
mailing list