[racket] Help: Passing a class to a macro and not an identifier

From: Laurent (laurent.orseau at gmail.com)
Date: Wed Sep 15 09:31:11 EDT 2010

On Wed, Sep 15, 2010 at 15:19, Robby Findler <robby at eecs.northwestern.edu>wrote:

> The class exists at runtime, not at compile time, so you can't just
> take an identifier like that and get the names of the methods back.
> (This is a fundamental difference between our class system and ones
> like in Java. See
> http://www.eecs.northwestern.edu/~robby/pubs/papers/aplas2006-fff.pdf<http://www.eecs.northwestern.edu/%7Erobby/pubs/papers/aplas2006-fff.pdf>
> for more info about the high level properties of the class system.)
>
> At least not with the current class system. You can, however, define a
> macro, something like:
>
> (define-class <name> <class-expr>)
>
> and then have define-class inspect the class-expr to find the method
> names (note you'll have to use local-expand to make this work) and put
> that information into <name> at compile time.
>

Or maybe I can define a% in a separate module and require it for-syntax
either?

So here is where I am right now:

#lang racket

(require
  "a.rkt"
  (for-syntax "a.rkt"))

(define-syntax-rule (define-singleton-sender fun obj meth)
  (define-syntax-rule (fun args (... ...))
    (send (obj) meth args (... ...))))

(define-syntax (class->singleton stx)
  (syntax-case stx ()
    [(_ cl obj)
     (with-syntax ([(name ...)
                    (interface->method-names (class->interface a%))]) ; ***
       #'(begin (define-singleton-sender name obj name)
                ...))]))

(define current-a (make-parameter (new a% [a 3])))

(class->singleton a% current-a)

This works for class a%, but only for this one, as I don't know how to pass
a%
as an argument to the macro (note the a% on line ***).
How can I do that?




>
> hth,
> Robby
>
> On Wed, Sep 15, 2010 at 7:50 AM, Laurent <laurent.orseau at gmail.com> wrote:
> > Dear all,
> >
> > Apparently I still don't have my macro writing licence.
> > I'm stuck somewhere around syntax-case and with-syntax.
> >
> > Here is my problem.
> > Suppose something like this:
> >
> > (define-syntax (class->singleton stx)
> >   (syntax-case stx ()
> >     [(_ cl)
> >      (with-syntax ([(name ...)
> >                     (interface->method-names (class->interface #'cl))]) ;
> > ***
> >        #'(begin (define-something name)
> >                 ...))]))
> >
> > (class->singleton a%)
> >
> > On line *** I want to match (name ...) with the list of method-names of
> > the given class (here a%).
> > Obviously, this is wrong, since #'cl is just a syntaxed identifier IIUC,
> > but should be the class itself.
> > datum->syntax and syntax->datum don't help either, so what should I do?
> > Any hint (even an RTFM link) would be appreciated.
> >
> > Thanks,
> > Laurent
> >
> >
> >
> > _________________________________________________
> >  For list-related administrative tasks:
> >  http://lists.racket-lang.org/listinfo/users
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20100915/a30cfb9a/attachment.html>

Posted on the users mailing list.