[racket] Confused by augment and inner

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Mon Sep 24 07:34:24 EDT 2012

Your understanding seems correct to me. You had a syntax error.

#lang racket

(define a%
  (class object%
    (define/pubment (hello)
      (printf "Hello~n")
      (inner 0 hello))))

(define b%
  (class a%
    (define/augment (hello)
      ;Call super here?
      (printf ", world!~n"))))

(send (new b%) hello)

On Mon, Sep 24, 2012 at 1:31 AM, Gregory Woodhouse <gregwoodhouse at me.com> wrote:
> I am trying to understand how augmentable methods (as described in section
> 13.5 of The Guide) work.
> Between the extremes of allowing arbitrary overriding and disallowing
> overriding entirely, the class system also supports Beta-style augmentable
> methods [Goldberg04]. A method declared with pubment is like public, but the
> method cannot be overridden in subclasses; it can be augmented only. A
> pubment method must explicitly invoke an augmentation (if any) using inner;
> a subclass augments the method using augment, instead of override.
> From this I conclude that if, for example, I have a class a% and a subclass
> b% and I want to augment a method of a% in b% I need to call inner in the
> definition of the method in a%, not b%. Something like this
> #lang racket
> (define a%
>   (class object%
>     (super-new)
>     (define/pubment (hello)
>       (printf "Hello~n")
>       (inner 0))))
> (define b%
>   (class a%
>     (super-new)
>     (define/augment (hello)
>       ;Call super here?
>       (printf ", world!~n"))))
> but this gives me an error (not really a surprise). My assumption is that
> super should be used in the subclass when overriding a method, but if a
> method is to be augmented any potential code in an augmenting class should
> be invoked from the superclass and super is not used in the subclass.
> Obviously, I'm missing something.
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users

Posted on the users mailing list.