6.4 Field and Method Access
In expressions within a class definition, the initialization variables, fields, and methods of the class are all part of the environment. Within a method body, only the fields and other methods of the class can be referenced; a reference to any other class-introduced identifier is a syntax error. Elsewhere within the class, all class-introduced identifiers are available, and fields and initialization variables can be mutated with set!.
6.4.1 Methods
Method names used within a class can only be used in the procedure position of an application expression; any other use is a syntax error.
To allow methods to be applied to lists of arguments, a method application can have the following form:
(method-id arg ... . arg-list-expr)
This form calls the method in a way analogous to (apply method-id arg ... arg-list-expr). The arg-list-expr must not be a parenthesized expression.
Methods are called from outside a class with the send, send/apply, and send/keyword-apply forms.
If obj-expr does not produce an object, the exn:fail:contract exception is raised. If the object has no public method named method-id, the exn:fail:object exception is raised.
syntax
(send/apply obj-expr method-id arg ... arg-list-expr)
syntax
(send/keyword-apply obj-expr method-id keyword-list-expr value-list-expr arg ... arg-list-expr)
procedure
(dynamic-send obj method-name v ... #:<kw> kw-arg ...) → any obj : object? method-name : symbol? v : any/c kw-arg : any/c
syntax
(send* obj-expr msg ...+)
msg = (method-id arg ...) | (method-id arg ... . arg-list-expr)
For example,
(send* edit (begin-edit-sequence) (insert "Hello") (insert #\newline) (end-edit-sequence))
is the same as
(let ([o edit]) (send o begin-edit-sequence) (send o insert "Hello") (send o insert #\newline) (send o end-edit-sequence))
syntax
(send+ obj-expr msg ...)
msg = (method-id arg ...) | (method-id arg ... . arg-list-expr)
This is the functional analogue of send*.
(define point% (class object% (super-new) (init-field [x 0] [y 0]) (define/public (move-x dx) (new this% [x (+ x dx)])) (define/public (move-y dy) (new this% [y (+ y dy)]))))
> (send+ (new point%) (move-x 5) (move-y 7) (move-x 12)) (object:point% ...)
syntax
(with-method ((id (obj-expr method-id)) ...) body ...+)
Example:
(let ([s (new stack%)]) (with-method ([push (s push!)] [pop (s pop!)]) (push 10) (push 9) (pop)))
is the same as
(let ([s (new stack%)]) (send s push! 10) (send s push! 9) (send s pop!))
6.4.2 Fields
syntax
(get-field id obj-expr)
If obj-expr does not produce an object, the exn:fail:contract exception is raised. If the object has no id field, the exn:fail:object exception is raised.
procedure
(dynamic-get-field field-name obj) → any/c
field-name : symbol? obj : object?
syntax
(set-field! id obj-expr expr)
If obj-expr does not produce an object, the exn:fail:contract exception is raised. If the object has no id field, the exn:fail:object exception is raised.
procedure
(dynamic-set-field! field-name obj v) → void?
field-name : symbol? obj : object? v : any/c
syntax
(field-bound? id obj-expr)
If obj-expr does not produce an object, the exn:fail:contract exception is raised.
syntax
(class-field-accessor class-expr field-id)
If class-expr does not produce a class, the exn:fail:contract exception is raised. If the class has no field-id field, the exn:fail:object exception is raised.
syntax
(class-field-mutator class-expr field-id)
If class-expr does not produce a class, the exn:fail:contract exception is raised. If the class has no field-id field, the exn:fail:object exception is raised.
6.4.3 Generics
A generic can be used instead of a method name to avoid the cost of relocating a method by name within a class.
syntax
(generic class-or-interface-expr id)
If class-or-interface-expr does not produce a class or interface, the exn:fail:contract exception is raised. If the resulting class or interface does not contain a method named id, the exn:fail:object exception is raised.
syntax
(send-generic obj-expr generic-expr arg ...)
(send-generic obj-expr generic-expr arg ... . arg-list-expr)
If obj-expr does not produce an object, or if generic-expr does not produce a generic, the exn:fail:contract exception is raised. If the result of obj-expr is not an instance of the class or interface encapsulated by the result of generic-expr, the exn:fail:object exception is raised.
procedure
(make-generic type method-name) → generic?
type : (or/c class? interface?) method-name : symbol?