[racket-dev] [racket] Question about fields in Racket OO
Yes, sorry -- define is for private fields, not public ones.
(This is something that can easily trip people up, ie making fields
when they really want to be making methods; but I don't have a good
idea of how to fix it.)
Robby
On Thu, Dec 16, 2010 at 7:56 AM, Jay McCarthy <jay.mccarthy at gmail.com> wrote:
> Does 'define' really mean 'make a field'? I thought fields had to be
> specially designated so that get-field would know about them...
> Yes, this program errors:
> #lang racket
> (define c%
> (class* object% ()
> (field [x 1])
> (define y 2)
> (super-new)))
> (define o (new c%))
> (field-names o)
> (get-field x o)
> (get-field y o)
> --
> I agree that 'define' is like making a field, but fields are something
> special too.
> Jay
> On Thu, Dec 16, 2010 at 6:51 AM, Robby Findler <robby at eecs.northwestern.edu>
> wrote:
>>
>> On Thu, Dec 16, 2010 at 12:22 AM, Mark Engelberg
>> <mark.engelberg at gmail.com> wrote:
>> > OK, it works when the set! occurs after the super-new. I didn't think
>> > set!
>> > would work at all in a class definition (as opposed to within a method);
>> > I
>> > was thinking of the whole system of defining classes as more of a
>> > declarative DSL that only allowed certain constructs.
>>
>> You've probably already figured this out, but the body of a class is a
>> series of definitions and expressions like at the top-level but
>> 'define' taking on the meaning of 'make a field', and a bunch of new
>> definitions appearing. The new stuff says what the methods are, but
>> everything else is just executed in sequence as if it were in the body
>> of the initializer (if this were in Java, say).
>>
>> hth,
>> Robby
>> _________________________________________________
>> For list-related administrative tasks:
>> http://lists.racket-lang.org/listinfo/dev
>
>
> --
> Jay McCarthy <jay at cs.byu.edu>
> Assistant Professor / Brigham Young University
> http://faculty.cs.byu.edu/~jay
>
> "The glory of God is Intelligence" - D&C 93
>