This is the mail archive of the guile@cygnus.com mailing list for the guile project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Mikael Djurfeldt <mdj@nada.kth.se> writes: > (let ((getter-cookie '(cookie)) > (setter-cookie '(cookie))) > (set! make-procedure-with-setter > (lambda (getter setter) > (lambda args > (cond ((eq? (car args) getter-cookie) getter) > ((eq? (car args) setter-cookie) setter) > (else (apply getter args)))))) > (set! getter > (lambda (proc) > (proc getter-cookie))) > (set! setter > (lambda (proc) > (proc setter-cookie)))) It is interesting to note what a good compiler can do with the expression (setter vector-ref), where (define vector-ref (make-procedure-with-setter old-vector-ref vector-set!)) if setter is bound read-only: (setter vector-ref) --> ((lambda (proc) (proc setter-cookie)) vector-ref) ;OK since setter ;is bound read-only --> (vector-ref setter-cookie) ;OK since lambda is read-only --> ((lambda args ...) setter-cookie) ;vector-ref read-only --> (cond ((eq? setter-cookie getter-cookie) ...)) ;car read-only --> vector-set! ;OK since setter-cookie and getter-cookie are constants So, a good compiler compiles (setter vector-ref) to maximally efficient code. It takes a really good compiler to do (vector-ref x i) efficiently, but it is also possible. /mdj