[racket] Confused by augment and inner

12 views
Skip to first unread message

Gregory Woodhouse

unread,
Sep 24, 2012, 2:31:48 AM9/24/12
to Racket Mailing List
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.

Stephen De Gabrielle

unread,
Sep 24, 2012, 3:15:03 AM9/24/12
to Gregory Woodhouse, Racket Mailing List
The way I read it was the new function gets called instead of inner;

#lang racket

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


(define b%
  (class a%
    (super-new)
    (define/augment (hello greg)
      ;Call super here?
      (printf " ~a ~n" greg))))

(send (new b%) hello "Bob")
-> Hello Bob!

Is this right?

Cheers, 
Stephen
--
 
--
Stephen De Gabrielle
Mobile        +44 (0)79 85189045
----
Professor: Oh God! I clicked without reading!
Cubert: And I slightly modified something I own!
Professor: We're monsters!

Stephen De Gabrielle

unread,
Sep 24, 2012, 3:44:18 AM9/24/12
to Gregory Woodhouse, Racket Mailing List
wow - i got that wrong. 

check this example from the reference


#lang racket

(define buzzer%
  (class object%
    (super-new)
    (define/pubment (buzz)
      (displayln "bzzzt")
      (inner (void) buzz))))
(define loud-buzzer%
  (class buzzer%
    (super-new)
    (define (buzz)
      (displayln "BZZZZZZZZZT"))
    (augment buzz)))
(send (new buzzer%) buzz)
;bzzzt
(send (new loud-buzzer%) buzz)
;bzzzt
;BZZZZZZZZZT

s.

Robby Findler

unread,
Sep 24, 2012, 7:34:24 AM9/24/12
to Gregory Woodhouse, Racket Mailing List
Your understanding seems correct to me. You had a syntax error.

#lang racket

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

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

(send (new b%) hello)
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users
>
____________________
Racket Users list:
http://lists.racket-lang.org/users
Reply all
Reply to author
Forward
0 new messages