Node:Procedures with Setters, Next:Macros, Previous:Procedure Properties, Up:Procedures and Macros
A procedure with setter is a special kind of procedure which normally behaves like any accessor procedure, that is a procedure which accesses a data structure. The difference is that this kind of procedure has a so-called setter attached, which is a procedure for storing something into a data structure.
Procedures with setters are treated specially when the procedure appears
in the special form set! (REFFIXME). How it works is best shown
by example.
Suppose we have a procedure called foo-ref, which accepts two
arguments, a value of type foo and an integer. The procedure
returns the value stored at the given index in the foo object.
Let f be a variable containing such a foo data
structure.1
(foo-ref f 0) => bar (foo-ref f 1) => braz
Also suppose that a corresponding setter procedure called
foo-set! does exist.
(foo-set! f 0 'bla) (foo-ref f 0) => bla
Now we could create a new procedure called foo, which is a
procedure with setter, by calling make-procedure-with-setter with
the accessor and setter procedures foo-ref and foo-set!.
Let us call this new procedure foo.
(define foo (make-procedure-with-setter foo-ref foo-set!))
foo can from now an be used to either read from the data
structure stored in f, or to write into the structure.
(set! (foo f 0) 'dum) (foo f 0) => dum
| make-procedure-with-setter procedure setter | Scheme Procedure |
| scm_make_procedure_with_setter (procedure, setter) | C Function |
| Create a new procedure which behaves like procedure, but with the associated setter setter. |
| procedure-with-setter? obj | Scheme Procedure |
| scm_procedure_with_setter_p (obj) | C Function |
Return #t if obj is a procedure with an
associated setter procedure.
|
| procedure proc | Scheme Procedure |
| scm_procedure (proc) | C Function |
| Return the procedure of proc, which must be either a procedure with setter, or an operator struct. |
| setter proc | Scheme Procedure |
| Return the setter of proc, which must be either a procedure with setter or an operator struct. |
Working definitions would be:
(define foo-ref vector-ref) (define foo-set! vector-set!) (define f (make-vector 2 #f))