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]

Re: "Current" solution for generalized set!


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