Re: [racket-dev] [racket] Question about fields in Racket OO

2010-12-16 Thread Robby Findler
On Thu, Dec 16, 2010 at 12:22 AM, Mark Engelberg
mark.engelb...@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

Re: [racket-dev] [racket] Question about fields in Racket OO

2010-12-16 Thread Jay McCarthy
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
ro...@eecs.northwestern.eduwrote:

 On Thu, Dec 16, 2010 at 12:22 AM, Mark Engelberg
 mark.engelb...@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 j...@cs.byu.edu
Assistant Professor / Brigham Young University
http://faculty.cs.byu.edu/~jay

The glory of God is Intelligence - DC 93
_
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/dev

Re: [racket-dev] [racket] Question about fields in Racket OO

2010-12-16 Thread Robby Findler
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.mccar...@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 ro...@eecs.northwestern.edu
 wrote:

 On Thu, Dec 16, 2010 at 12:22 AM, Mark Engelberg
 mark.engelb...@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 j...@cs.byu.edu
 Assistant Professor / Brigham Young University
 http://faculty.cs.byu.edu/~jay

 The glory of God is Intelligence - DC 93

_
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/dev

Re: [racket-dev] [racket] Question about fields in Racket OO

2010-12-16 Thread Jay McCarthy
This seems like a trivial point because the class system doesn't have to
track these things and they are in fact part of the closures of the methods,
so I don't see in what sense they are fields. Perhaps I am blinded by my
reading of the implementation. I certainly agree they are essentially
fields, but I can't but think of them as closed-over variables.

Jay

On Thu, Dec 16, 2010 at 7:00 AM, Carl Eastlund c...@ccs.neu.edu wrote:

 To quote the class* documentation:
 (
 http://docs.racket-lang.org/reference/createclass.html#%28part._clfields%29
 )

 Each field, init-field, and non-method define-values clause in a
 class declares one or more new fields for the class. Fields declared
 with field or init-field are public.

 So only the public ones are accessible via get-field.

 Carl Eastlund

 On Thu, Dec 16, 2010 at 8:56 AM, Jay McCarthy jay.mccar...@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 
 ro...@eecs.northwestern.edu
  wrote:
 
  On Thu, Dec 16, 2010 at 12:22 AM, Mark Engelberg
  mark.engelb...@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




-- 
Jay McCarthy j...@cs.byu.edu
Assistant Professor / Brigham Young University
http://faculty.cs.byu.edu/~jay

The glory of God is Intelligence - DC 93
_
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/dev

Re: [racket-dev] [racket] Question about fields in Racket OO

2010-12-16 Thread Robby Findler
There is one field per object, but one method (closure) per class.
Otherwise, you're right; and that's just what fields are. :)

Robby

On Thu, Dec 16, 2010 at 8:08 AM, Jay McCarthy jay.mccar...@gmail.com wrote:
 This seems like a trivial point because the class system doesn't have to
 track these things and they are in fact part of the closures of the methods,
 so I don't see in what sense they are fields. Perhaps I am blinded by my
 reading of the implementation. I certainly agree they are essentially
 fields, but I can't but think of them as closed-over variables.
 Jay

 On Thu, Dec 16, 2010 at 7:00 AM, Carl Eastlund c...@ccs.neu.edu wrote:

 To quote the class* documentation:

 (http://docs.racket-lang.org/reference/createclass.html#%28part._clfields%29)

 Each field, init-field, and non-method define-values clause in a
 class declares one or more new fields for the class. Fields declared
 with field or init-field are public.

 So only the public ones are accessible via get-field.

 Carl Eastlund

 On Thu, Dec 16, 2010 at 8:56 AM, Jay McCarthy jay.mccar...@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
  ro...@eecs.northwestern.edu
  wrote:
 
  On Thu, Dec 16, 2010 at 12:22 AM, Mark Engelberg
  mark.engelb...@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



 --
 Jay McCarthy j...@cs.byu.edu
 Assistant Professor / Brigham Young University
 http://faculty.cs.byu.edu/~jay

 The glory of God is Intelligence - DC 93

_
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/dev

Re: [racket-dev] [racket] Question about fields in Racket OO

2010-12-16 Thread Mark Engelberg
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.

Now that you point it out though, I see there is an example in the guide
that does set! on an inherited field.

Thanks,

Mark

On Wed, Dec 15, 2010 at 9:53 PM, Robby Findler
ro...@eecs.northwestern.eduwrote:

 set!?

 Try it in both positions (the commented out one and the other one):
 the thing to keep in mind is that the declaration in c% is also kind
 of like a set! that happens when the object is initialized.

 Robby

 #lang racket
 (define c%
  (class object%
(field [f 1])
(define/public (get-f) f)
(super-new)))

 (define d%
  (class c%
(inherit-field f)
(set! f 2)
(super-new)
; (set! f 2)
))

 (send (new d%) get-f)

 On Wed, Dec 15, 2010 at 11:46 PM, Mark Engelberg
 mark.engelb...@gmail.com wrote:
  Thanks.  That seems to address the shared private issue.
 
  So is there a way to give a new value to an inherited field?
 
  --Mark
 
  On Wed, Dec 15, 2010 at 9:13 PM, Robby Findler 
 ro...@eecs.northwestern.edu
  wrote:
 
  See define-local-member-name.
 
  Robby
 
  On Wed, Dec 15, 2010 at 10:38 PM, Mark Engelberg
  mark.engelb...@gmail.com wrote:
   I'm playing around with the object-oriented subset of Racket, and have
 a
   couple of questions.
  
   Ideally, I'd like to equip a class with a field that is visible only
 to
   it
   and its subclasses.  As far as I can tell, though, this isn't
 possible.
   It
   seems that I have to make a choice between a completely private field
   visible only to the class (by just using define) or making a
   completely
   public field (by using field).  Correct?
  
   Now, let's say I make the field public.
  
   In the subclass, how do I change the default value of field?
  
   For example, in the superclass, I might have
   (field [a 300])
  
   but in the subclass, I want to do something like
   (inherit-field [a 200])
  
   However, as far as I can tell, the syntax doesn't support anything
 other
   than
   (inherit-field a)
  
   Thanks,
  
   Mark
  
   _
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users
  
 
 

_
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/dev

Re: [racket-dev] [racket] Question about fields in Racket OO

2010-12-15 Thread Robby Findler
set!?

Try it in both positions (the commented out one and the other one):
the thing to keep in mind is that the declaration in c% is also kind
of like a set! that happens when the object is initialized.

Robby

#lang racket
(define c%
  (class object%
(field [f 1])
(define/public (get-f) f)
(super-new)))

(define d%
  (class c%
(inherit-field f)
(set! f 2)
(super-new)
; (set! f 2)
))

(send (new d%) get-f)

On Wed, Dec 15, 2010 at 11:46 PM, Mark Engelberg
mark.engelb...@gmail.com wrote:
 Thanks.  That seems to address the shared private issue.

 So is there a way to give a new value to an inherited field?

 --Mark

 On Wed, Dec 15, 2010 at 9:13 PM, Robby Findler ro...@eecs.northwestern.edu
 wrote:

 See define-local-member-name.

 Robby

 On Wed, Dec 15, 2010 at 10:38 PM, Mark Engelberg
 mark.engelb...@gmail.com wrote:
  I'm playing around with the object-oriented subset of Racket, and have a
  couple of questions.
 
  Ideally, I'd like to equip a class with a field that is visible only to
  it
  and its subclasses.  As far as I can tell, though, this isn't possible.
  It
  seems that I have to make a choice between a completely private field
  visible only to the class (by just using define) or making a
  completely
  public field (by using field).  Correct?
 
  Now, let's say I make the field public.
 
  In the subclass, how do I change the default value of field?
 
  For example, in the superclass, I might have
  (field [a 300])
 
  but in the subclass, I want to do something like
  (inherit-field [a 200])
 
  However, as far as I can tell, the syntax doesn't support anything other
  than
  (inherit-field a)
 
  Thanks,
 
  Mark
 
  _
   For list-related administrative tasks:
   http://lists.racket-lang.org/listinfo/users
 


_
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/dev