racket/class: doc fixes and improvements

- actually fixed the grammar this time
 - examples for most class/object utils
 - consistency with naming conventions
 - interface ctc example
This commit is contained in:
Asumu Takikawa 2012-06-30 15:12:20 -04:00
parent 1d43b5a0db
commit 07d279e3ee

View File

@ -67,10 +67,14 @@
#'(begin (defdefshorthands form) ...)])) #'(begin (defdefshorthands form) ...)]))
(define class-eval (make-base-eval)) (define class-eval (make-base-eval))
(define class-ctc-eval (make-base-eval))
) )
@(interaction-eval #:eval class-eval (require racket/class)) @(interaction-eval #:eval class-eval (require racket/class))
@(interaction-eval
#:eval class-ctc-eval
(require racket/class racket/contract))
@title[#:tag "mzlib:class" #:style 'toc]{Classes and Objects} @title[#:tag "mzlib:class" #:style 'toc]{Classes and Objects}
@ -193,11 +197,13 @@ superinterfaces specify inconsistent derivation requirements, the
@exnraise[exn:fail:object]. @exnraise[exn:fail:object].
@defexamples[ @defexamples[
#:eval class-eval #:eval class-ctc-eval
(define file-interface (define file-interface<%>
(interface () open close read-byte write-byte)) (interface () open close read-byte write-byte))
(define directory-interface (define directory-interface<%>
(interface (file-interface) file-list parent-directory)) (interface (file-interface<%>)
[file-list (-> (listof (is-a?/c file-interface<%>)))]
parent-directory))
]} ]}
@defform/subs[(interface* (super-interface-expr ...) @defform/subs[(interface* (super-interface-expr ...)
@ -222,9 +228,9 @@ structure type property's guard, if any).
@defexamples[ @defexamples[
#:eval class-eval #:eval class-eval
(define i (interface* () ([prop:custom-write (define i<%> (interface* () ([prop:custom-write
(lambda (obj port mode) (void))]) (lambda (obj port mode) (void))])
method1 method2 method3)) method1 method2 method3))
]} ]}
@; ------------------------------------------------------------------------ @; ------------------------------------------------------------------------
@ -281,7 +287,7 @@ interface @racket[(class->interface object%)], and is transparent
[init-decl [init-decl
id id
renamed (renamed)
(maybe-renamed default-value-expr)] (maybe-renamed default-value-expr)]
[field-decl [field-decl
@ -381,7 +387,7 @@ Like @racket[class*], but omits the @racket[_interface-expr]s, for the case that
@defexamples[ @defexamples[
#:eval class-eval #:eval class-eval
(define book-class (define book-class%
(class object% (class object%
(field (pages 5)) (field (pages 5))
(define/public (letters) (define/public (letters)
@ -400,12 +406,12 @@ a syntax error.
#:eval class-eval #:eval class-eval
(define (describe obj) (define (describe obj)
(printf "Hello ~a\n" obj)) (printf "Hello ~a\n" obj))
(define table (define table%
(class object% (class object%
(define/public (describe-self) (define/public (describe-self)
(describe this)) (describe this))
(super-new))) (super-new)))
(send (new table) describe-self) (send (new table%) describe-self)
]} ]}
@defidform[this%]{ @defidform[this%]{
@ -2158,77 +2164,179 @@ A @racket[print] request is directed to @racket[custom-write].}
@defproc[(object? [v any/c]) boolean?]{ @defproc[(object? [v any/c]) boolean?]{
Returns @racket[#t] if @racket[v] is an object, @racket[#f] otherwise.} Returns @racket[#t] if @racket[v] is an object, @racket[#f] otherwise.
@defexamples[#:eval class-eval
(object? (new object%))
(object? object%)
(object? "clam chowder")
]}
@defproc[(class? [v any/c]) boolean?]{ @defproc[(class? [v any/c]) boolean?]{
Returns @racket[#t] if @racket[v] is a class, @racket[#f] otherwise.} Returns @racket[#t] if @racket[v] is a class, @racket[#f] otherwise.
@defexamples[#:eval class-eval
(class? object%)
(class? (class object% (super-new)))
(class? (new object%))
(class? "corn chowder")
]}
@defproc[(interface? [v any/c]) boolean?]{ @defproc[(interface? [v any/c]) boolean?]{
Returns @racket[#t] if @racket[v] is an interface, @racket[#f] otherwise.} Returns @racket[#t] if @racket[v] is an interface, @racket[#f] otherwise.
@defexamples[#:eval class-eval
(interface? (interface () empty cons first rest))
(interface? object%)
(interface? "gazpacho")
]}
@defproc[(generic? [v any/c]) boolean?]{ @defproc[(generic? [v any/c]) boolean?]{
Returns @racket[#t] if @racket[v] is a @tech{generic}, @racket[#f] otherwise.} Returns @racket[#t] if @racket[v] is a @tech{generic}, @racket[#f] otherwise.
@defexamples[#:eval class-eval
(define c%
(class object%
(super-new)
(define/public (m x)
(+ 3.14 x))))
(generic? (generic c% m))
(generic? c%)
(generic? "borscht")
]}
@defproc[(object=? [a object?] [b object?]) boolean?]{ @defproc[(object=? [a object?] [b object?]) boolean?]{
Determines if two objects are the same object, or not; this procedure uses Determines if two objects are the same object, or not; this procedure uses
@racket[eq?], but also works properly with contracts.} @racket[eq?], but also works properly with contracts.
@defexamples[#:eval class-ctc-eval
(define obj-1 (new object%))
(define/contract obj-2 (object/c) obj-1)
(object=? obj-1 obj-1)
(object=? (new object%) obj-1)
(object=? obj-1 obj-2)
(object=? obj-1 (new (class object% (super-new))))
]}
@defproc[(object->vector [object object?] [opaque-v any/c #f]) vector?]{ @defproc[(object->vector [object object?] [opaque-v any/c #f]) vector?]{
Returns a vector representing @racket[object] that shows its Returns a vector representing @racket[object] that shows its
inspectable fields, analogous to @racket[struct->vector].} inspectable fields, analogous to @racket[struct->vector].
@defexamples[#:eval class-eval
(object->vector (new object%))
(object->vector (new (class object%
(super-new)
(field [x 5] [y 10]))))
]}
@defproc[(class->interface [class class?]) interface?]{ @defproc[(class->interface [class class?]) interface?]{
Returns the interface implicitly defined by @racket[class].} Returns the interface implicitly defined by @racket[class].
@defexamples[#:eval class-eval
(class->interface object%)
]}
@defproc[(object-interface [object object?]) interface?]{ @defproc[(object-interface [object object?]) interface?]{
Returns the interface implicitly defined by the class of Returns the interface implicitly defined by the class of
@racket[object].} @racket[object].
@defexamples[#:eval class-eval
(object-interface (new object%))
]}
@defproc[(is-a? [v any/c] [type (or/c interface? class?)]) boolean?]{ @defproc[(is-a? [v any/c] [type (or/c interface? class?)]) boolean?]{
Returns @racket[#t] if @racket[v] is an instance of a class Returns @racket[#t] if @racket[v] is an instance of a class
@racket[type] or a class that implements an interface @racket[type], @racket[type] or a class that implements an interface @racket[type],
@racket[#f] otherwise.} @racket[#f] otherwise.
@defexamples[#:eval class-eval
(define point<%> (interface () get-x get-y))
(define 2d-point%
(class* object% (point<%>)
(super-new)
(field [x 0] [y 0])
(define/public (get-x) x)
(define/public (get-y) y)))
(is-a? (new 2d-point%) 2d-point%)
(is-a? (new 2d-point%) point<%>)
(is-a? (new object%) 2d-point%)
(is-a? (new object%) point<%>)
]}
@defproc[(subclass? [v any/c] [class class?]) boolean?]{ @defproc[(subclass? [v any/c] [class class?]) boolean?]{
Returns @racket[#t] if @racket[v] is a class derived from (or equal Returns @racket[#t] if @racket[v] is a class derived from (or equal
to) @racket[class], @racket[#f] otherwise.} to) @racket[class], @racket[#f] otherwise.
@defexamples[#:eval class-eval
(subclass? (class object% (super-new)) object%)
(subclass? object% (class object% (super-new)))
(subclass? object% object%)
]}
@defproc[(implementation? [v any/c] [interface interface?]) boolean?]{ @defproc[(implementation? [v any/c] [interface interface?]) boolean?]{
Returns @racket[#t] if @racket[v] is a class that implements Returns @racket[#t] if @racket[v] is a class that implements
@racket[interface], @racket[#f] otherwise.} @racket[interface], @racket[#f] otherwise.
@defexamples[#:eval class-eval
(define i<%> (interface () go))
(define c%
(class* object% (i<%>)
(super-new)
(define/public (go) 'go)))
(implementation? c% i<%>)
(implementation? object% i<%>)
]}
@defproc[(interface-extension? [v any/c] [interface interface?]) boolean?]{ @defproc[(interface-extension? [v any/c] [interface interface?]) boolean?]{
Returns @racket[#t] if @racket[v] is an interface that extends Returns @racket[#t] if @racket[v] is an interface that extends
@racket[interface], @racket[#f] otherwise.} @racket[interface], @racket[#f] otherwise.
@defexamples[#:eval class-eval
(define point<%> (interface () get-x get-y))
(define colored-point<%> (interface (point<%>) color))
(interface-extension? colored-point<%> point<%>)
(interface-extension? point<%> colored-point<%>)
(interface-extension? (interface () get-x get-y get-z) point<%>)
]}
@defproc[(method-in-interface? [sym symbol?] [interface interface?]) boolean?]{ @defproc[(method-in-interface? [sym symbol?] [interface interface?]) boolean?]{
Returns @racket[#t] if @racket[interface] (or any of its ancestor Returns @racket[#t] if @racket[interface] (or any of its ancestor
interfaces) includes a member with the name @racket[sym], @racket[#f] interfaces) includes a member with the name @racket[sym], @racket[#f]
otherwise.} otherwise.
@defexamples[#:eval class-eval
(define i<%> (interface () get-x get-y))
(method-in-interface? 'get-x i<%>)
(method-in-interface? 'get-z i<%>)
]}
@defproc[(interface->method-names [interface interface?]) (listof symbol?)]{ @defproc[(interface->method-names [interface interface?]) (listof symbol?)]{
@ -2236,14 +2344,32 @@ otherwise.}
Returns a list of symbols for the method names in @racket[interface], Returns a list of symbols for the method names in @racket[interface],
including methods inherited from superinterfaces, but not including including methods inherited from superinterfaces, but not including
methods whose names are local (i.e., declared with methods whose names are local (i.e., declared with
@racket[define-local-member-names]).} @racket[define-local-member-names]).
@defexamples[#:eval class-eval
(define i<%> (interface () get-x get-y))
(interface->method-names i<%>)
]}
@defproc[(object-method-arity-includes? [object object?] [sym symbol?] [cnt exact-nonnegative-integer?]) @defproc[(object-method-arity-includes? [object object?] [sym symbol?] [cnt exact-nonnegative-integer?])
boolean?]{ boolean?]{
Returns @racket[#t] if @racket[object] has a method named @racket[sym] Returns @racket[#t] if @racket[object] has a method named @racket[sym]
that accepts @racket[cnt] arguments, @racket[#f] otherwise.} that accepts @racket[cnt] arguments, @racket[#f] otherwise.
@defexamples[#:eval class-eval
(define c%
(class object%
(super-new)
(define/public (m x [y 0])
(+ x y))))
(object-method-arity-includes? (new c%) 'm 1)
(object-method-arity-includes? (new c%) 'm 2)
(object-method-arity-includes? (new c%) 'm 3)
(object-method-arity-includes? (new c%) 'n 1)
]}
@defproc[(field-names [object object?]) (listof symbol?)]{ @defproc[(field-names [object object?]) (listof symbol?)]{
@ -2251,7 +2377,12 @@ that accepts @racket[cnt] arguments, @racket[#f] otherwise.}
Returns a list of all of the names of the fields bound in Returns a list of all of the names of the fields bound in
@racket[object], including fields inherited from superinterfaces, but @racket[object], including fields inherited from superinterfaces, but
not including fields whose names are local (i.e., declared with not including fields whose names are local (i.e., declared with
@racket[define-local-member-names]).} @racket[define-local-member-names]).
@defexamples[#:eval class-eval
(field-names (new object%))
(field-names (new (class object% (super-new) (field [x 0] [y 0]))))
]}
@defproc[(object-info [object any/c]) (values (or/c class? #f) boolean?)]{ @defproc[(object-info [object any/c]) (values (or/c class? #f) boolean?)]{