[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
``Update functions'' in Scheme.
> Did anybody already think about adding ``generalized functions''
> (a la Common-Lisp's setf/defsetf feature) to Scheme? This would
> eliminate the need for several primitive procedures, among them
> set-car!, set-cdr!, vector-set!, and string-set!. Instead of writing
>
> (set-car! p 5) or (vector-set! v 10 'a)
>
> this would make it possible to write
>
> (set! (car p) 5) or (set! (vector-ref v 10) 'a)
What's so great about SETF? It doesn't eliminate the *need* for
the setting primitives (after all, they conceptually must still
be there); it just makes it easier to remember their "names"
by providing a convention for deriving the setter from the
accessor.
But it's easy to develop alternate naming conventions without
altering Scheme. One simple convention can be carried out
by simple renaming:
(define set!car set-car!)
(define set!cdr set-cdr!)
(define set!vector-ref vector-set!)
(define set!string-ref string-set!)
Here the name of each setter is the name of the accessor prefixed
by set! Now we can write
(set!car p 5) or (set!vector-ref v 10 'a)
which, except for the missing pair of parens, looks a lot like
the SETF approach. And we didn't have to extend Scheme all!
- Lyn -