[plt-scheme] "appending" to classes rather than extending

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Wed Mar 5 17:25:10 EST 2008

Yes. Since you want to talk about both base:bar and extension:bar in  
one unit, I don't see how to do it w/o some name shuffling.

BTW, happens if the foo and bar methods are (mutually) recursive in  
Ruby. Does this "just work"?

-- Matthias






On Mar 5, 2008, at 4:51 PM, Rob Hunter wrote:

> Thanks, Matthias.  Below is my interpretation of your suggestion of
> using units to get this effect.  The only parts of my solution that I
> don't like is how I had to prefix the import in extension-unit%, and
> how I had to explicitly define foo for export even though I didn't
> want to override it.  Surely there's a way to avoid both of those
> things...
>
> Thanks,
> Rob
>
> (define-signature sig^ (foo bar))
>
> (define-unit base-unit%
>   (import)
>   (export sig^)
>
>   (define (foo)
>     "foo base impl")
>
>   (define (bar)
>     "bar base impl"))
>
> (define-unit extension-unit%
>   (import (prefix base: sig^))
>   (export sig^)
>
>   (define foo base:foo)
>
>   (define (bar)
>     "appended bar impl"))
>
> (define-compound-unit merged-unit%
>   (import)
>   (export RESULT)
>   (link [((BASE : sig^)) base-unit%]
>         [((RESULT : sig^)) extension-unit% BASE]))
>
>
> REPL interaction:
>> (define-values/invoke-unit merged-unit% (import) (export sig^))
>> (foo)
> "foo base impl"
>> (bar)
> "appended bar impl"
>
>
>
>
>
>
> On Wed, Mar 5, 2008 at 12:58 PM, Matthias Felleisen
> <matthias at ccs.neu.edu> wrote:
>>
>>  You could achieve this kind of effect (via units) but re-definitions
>>  in a module (and that's what this boils down to) of the same name  
>> are
>>  frowned upon in Scheme. -- Matthias
>>
>>  P.S. Re-definitions at the top-level have been around for a LONG  
>> time
>>  and there is a reason why Schemers are moving away from that  
>> approach.
>>
>>
>>
>>  On Mar 5, 2008, at 3:41 PM, Rob Hunter wrote:
>>
>>> Hi all,
>>>
>>> I'm looking to be able to append a few methods to a class.  In  
>>> Ruby, I
>>> can do something like this:
>>>
>>> class Foo
>>>   def bar
>>>     ...
>>>   end
>>>   ...
>>> end
>>>
>>> class Foo
>>>   def baz
>>>     ...
>>>   end
>>> end
>>>
>>> and both bar and baz will be a part of Foo (these two class defs  
>>> could
>>> be in the same file, or in two different files that are both  
>>> loaded).
>>> Anything like this in the PLT Scheme class system?
>>>
>>> Thanks,
>>> Rob
>>> _________________________________________________
>>>   For list-related administrative tasks:
>>>   http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>>
>>



Posted on the users mailing list.