[racket] Calling Private Methods on non-this Objects?

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Thu May 30 17:16:14 EDT 2013

Do you know about define-local-member-name? 

#lang racket

(module server racket
  (provide c% a)

  (define-local-member-name a b)
  (define c%
    (class object%
      (field [x 10])
      (define/public (a) x)
      (define/public (b y) (set! x y)))))
(module client racket
  (require (submod ".." server))
  (define c (new c%))
  (with-handlers ((exn:fail:object? (lambda (x) (displayln `(message not found)))))
    (send c b))
  (displayln (send c a)))

(require 'client)
 I think you're looking for it. -- Matthias

On May 30, 2013, at 3:05 PM, Sean Kanaley <skanaley at gmail.com> wrote:

> In C++ for example, the following is valid:
> class A {
> private:
>     int test(A a) { return n + a.n; }
>     int n;
> };
> The key point is the "a.n" is valid.
> I'm trying to create a 3d game in Racket, and in order to avoid recomputing world transforms all the time, child objects (say a rotatable gun on a parent tank) take a parameter to their parent which is used to add the child ("this") to the parent, in order that the parent update a delayed world transform computation in case of multiple calls to set-trans!, roughly:
> (define obj%
>   (class object% (super-new) (init ... [parent #f])
>     (define p parent)
>     (define cs '())
>     (when p (send p add-child! this))
>     (define/public (set-trans! new-t)
>       ... <includes delayed world-trans calc>
>       (for ([c cs])
>         (send c set-trans! (send c local-trans))))
>     ...
>     (define/public/private/etc. (add-child! c) (set! cs (cons c cs)))))
> It obviously works with "define/public", but I'm hoping there is a way to not expose the method everywhere.  It's in essence private, but Racket seems to not allow access even from within the class (send complains "no such method").
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users

Posted on the users mailing list.