Oops, when I said

  (syntax C-x
    (lambda (node compiler)
      `(long@ ,[node second] 1)))

I really meant to say

  (syntax C-x
    (lambda (node compiler)
      `(long@ ,[node second] 0)))

Cheers,
Alex

On 5/14/07, Alessandro Warth <[EMAIL PROTECTED]> wrote:
> Hi Hans,
>
> The problem is that you are not using your new syntax correctly.
> Instead of saying
>
>   (newClass 'MyClass)
>
> you should be saying
>
>   (newClass MyClass)
>
>
> [node second] in your "syntax" evaluates to the symbol object
> #MyClass, so when you quote it, you are generating the code
>
>   (define (quote MyClass) [Prototype new])
>
> when what you really want is
>
>   (define MyClass [Prototype new])
>
>
> The error message you are getting has to do with a mechanism built
> into the compiler for doing some rewrites automatically. For instance,
> when you say
>
>   (set (foo x) 5)
>
> that gets translated automatically to
>
>   (set-foo x 5)
>
> Similarly, when the compiler sees
>
>   (define (quote MyClass) [Prototype new])
>
> it translates that to
>
>   (define-quote MyClass [Prototype new])
>
>
> Why does this mechanism even exist? I'll give you an example...
> Suppose you want to define some new syntax for accessing a field of an
> object without doing a message send:
>
>   (define-type C Object (x))
>
>   (syntax C-x
>     (lambda (node compiler)
>       `(long@ ,[node second] 1)))
>
> Now you should be able to say things like:
>
>   (define foo [C new])
>   (C-x foo) ; access the x field of foo without doing a message send
>
> Accessing the value of foo's x field is not so useful if you can't set
> it... so you'd like to be able to write something like:
>
>   (set (C-x foo) 1234)
>
> Interestingly, this does the right thing already, without any
> additional work. And here's why: your "syntax" translates the
> expression above into
>
>   (set (long@ foo 1) 1234)
>
> When the compiler sees this, it rewrites it to
>
>   (set-long@ foo 1 1234)
>
> And because set-long@ is understood by the compiler, this expression
> compiles to the right thing. So by simply defining a syntax for
> accessing a field, we get the setter  for free.
>
>
> An even better example of this is the way Jolt deals with method
> declarations. When you write
>
>   (define [C m: x] x)
>
> the compiler desugars the [C m: x] into (send 'm: C x), so the whole
> expression turns into
>
>   (define (send 'm: C x) x)
>
> This is automatically translated to
>
>   (define-send 'm C x x)
>
> which, if you look inside object.k, means
>
>   (syntax define-send ; selector type args... expr
>     (lambda (form compiler)
>       (let ((selector [form second])
>             (type     [form third])
>             (args     [form copyFrom: '3 to: [[form size] - '2]])
>             (expr     [form last]))
>         `(add-method ,type ,selector (lambda (_closure _self self
> ,@args) ,expr)))))
>
> So, as you can see, there's nothing magic about method declarations in
> Jolt... is that cool or what? :)
>
> Cheers,
> Alex
>
> On 5/14/07, SainTiss <[EMAIL PROTECTED]> wrote:
> > Hi all,
> >
> > I'm trying to create a new node "newClass", which should assign the result 
> > of
> > a bit of pepsi code to a variable of which the name if provided as a
> > parameter to "newClass".
> >
> > So:
> >
> > (newClass 'MyClass)
> >
> > should result in:
> >
> > (define MyClass [Prototype new])
> >
> > I tried to accomplish this using the following piece of jolt code:
> >
> > (syntax newClass ; (newClass name)
> >        (lambda (node compiler)
> >          `(define ,[node second] [Prototype new])))
> >
> > But I get the following error:
> >
> > undefined: define-quote
> >
> > I can't really trace this back to something I did wrong, but if I replace ,
> > [node second] by a hardcoded name, I don't get the error.
> >
> > Did I do something wrong here?
> >
> > Also, I'm assuming (newClass 'MyClass) is the correct syntax to use my new
> > node, but maybe I should use (newClass '"MyClass") or still something else?
> >
> > Thanks,
> >
> > Hans
> >
> > --
> > A liberal is a person whose interests aren't at stake at the moment
> >   -- Willis Player
> >
> > Hans Schippers
> > Research Assistant of the Research Foundation - Flanders (FWO - Vlaanderen)
> > http://www.win.ua.ac.be/~hschipp/
> > Formal Techniques in Software Engineering (FoTS)
> > University of Antwerp
> > Middelheimlaan 1
> > 2020 Antwerpen - Belgium
> > Phone: +32 3 265 38 71
> > Fax: +32 3 265 37 77
> >
> > _______________________________________________
> > fonc mailing list
> > [email protected]
> > http://vpri.org/mailman/listinfo/fonc
> >
> >
> >
>
_______________________________________________
fonc mailing list
[email protected]
http://vpri.org/mailman/listinfo/fonc

Reply via email to