guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Message Passing with GOOPS


From: Ralf Mattes
Subject: Re: Message Passing with GOOPS
Date: Fri, 26 Jun 2015 10:18:27 +0200
User-agent: Mutt/1.5.23 (2014-03-12)

On Wed, Jun 24, 2015 at 10:21:44PM +0200, Michael Tiedtke wrote:
> (use-modules (oop goops))
> 
> GOOPS has some nice features (you can even use unexported methods with
> generics in 1.8) but there is no message passing paradigm. 

Guile's GOOPS is a (rather impressive) clone of CLOS, the Common Lisp Object 
System. I such a system functions/methods don't  "belong" to a class. 

> Objective-C has
> /tell/ Racket has /send/ but Guile/GOOPS is missing /call/.

Message passing only exists in object systems where methods belong to 
a class/object. Generic functions don't "belong" to a class/object.
If you really want to use a far inferior OO system you might want to port
Common Lisp's Flavour system :-)

> 
> This is a first "raw" definition where the parameter /message/ has to be a
> quoted symbol.
> 
> (define-method (call (receiver <object>) message . arguments)
>   (apply (slot-ref receiver message) arguments))
> 
> 
> The class definition still looks like traditional GOOPS but it works.
> 
> An example:
> 
> (define-class <receiver> ()
>   (msg #:init-value (lambda () 'hello-world)))
> 
> (define r (make <receiver>))
> (call r 'msg) => 'hello-world
> 
> 
> Now I'd like to have an easier syntax for describing the slot. The
> definition might be:
> 
> (define-syntax define-message
>   (syntax-rules ()
>     ((_ (message-name arguments ... ) body ...)
>      (message-name #:init-value (lambda (arguments ...) body ...)))))
> 
> But the following example doesn't work in 1.8:
> 
> (define-class <house> ()
>   (define-message (phone n)
>     (repeat n (lambda () (bell) 'rang)) ))
> 
> GOOPS complains about malformed slots and *seems* to see the unexpanded
> form.*

Here:

 $ guile-1.8 
 guile> (use-modules (oop goops))
 guile> define-class
 #<macro! define-class>

Why would you expect a macro to evaluate its arguments? :-)

> I could use a little help here, anyone?* Even for the naming scheme: /send/
> is already used by unix sockets and methods are part of the implementation
> of generics. Perhaps /message/ isn't that bad.

That's what modules are for. 

guile> (define-module (ios) #:export (send))  ; ios = Inferior Object System

and then:

guile> (ios:send ....)

> [...]
> PS
> Perhaps it's better to recreate a clean object model without 3,000 lines of
> C code like GOOPS. But then GOOPS really creates the illusion of an object
> oriented environment with a MOP ...

Why, 3000 lines of C code seems like a rather lean codebase for an objet system.

Just my 0.2 $

 Ralf Mattes





reply via email to

[Prev in Thread] Current Thread [Next in Thread]