You'll want foo-bar-baz the field accessor to be bound to something else that 
won't be shadowed when you define foo-bar-baz the generic function. Your 
define-generics likely is not in the same scope as the struct foo-bar 
definition, since

(require racket/generic)
(define x 0)
(define-generics y
  [x y])

Leads to a syntax error that there is a duplicate definition of x. Since 
#:methods reintroduces the names from bar's definition context into the 
following [...] scope, you're hosed for using the name. However, you can use 
unsafe-struct-ref

#lang racket/load
(module A racket
 (require racket/generic)
 (provide gen:bar foo-bar-baz)
 (define-generics bar
   [foo-bar-baz bar]))

(module B racket
  (require (prefix-in foo: 'A) racket/generic racket/unsafe/ops)
  (provide (struct-out foo-bar))
  (struct foo-bar (baz)
          #:methods foo:gen:bar
          [(define/generic gfoo-bar-baz foo-bar-baz)
           (define (foo-bar-baz-accessor fb) (unsafe-struct-ref fb 0))
           (define (foo:foo-bar-baz fb)
             (gfoo-bar-baz (foo-bar-baz-accessor fb)))]))

(require 'B)
(display (foo-bar-baz (foo-bar 42)))

Since struct doesn't provide access to the struct-type's -ref function, I 
couldn't suggest using make-struct-field-accessor as a safer alternative.
Others know a better way?
-Ian

----- Original Message -----
From: "Konrad Hinsen" <konrad.hin...@fastmail.net>
To: users@racket-lang.org
Cc: "J. Ian Johnson" <i...@ccs.neu.edu>
Sent: Tuesday, August 27, 2013 11:53:43 AM GMT -05:00 US/Canada Eastern
Subject: Re: [racket] Generics and modules

J. Ian Johnson writes:

 > No, your function is just ill-founded. Do you mean to destruct x to
 > find an inner bar to call gen-foo-far-baz on it?

I want to make the field baz of struct foo-bar accessible through the
generic interface method foo-bar-baz.

The background is that struct foo-bar already exists and is used by
client modules, so I can't change its name or the names of its
fields. The generic interface in module foo also exists and is used by
client modules. I want to implement the interface for my struct.  Any
solution is fine that doesn't require me to change the already
published interfaces of the two modules.

My real situation is not quite as dramatic because none of this code
is published and I am the only user, so I could just change some name
and go on. But I am doing this as an exercise in modular design.

Konrad.
____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to