bug in reference implementation of HASH-TABLE-UPDATE!
Taylor R Campbell 21 Dec 2009 09:06 UTC
Quoth the SRFI document:
Procedure: hash-table-update! hash-table key function [ thunk ]
---> undefined
Semantically equivalent to, but may be implemented more efficiently
than, the following code:
(hash-table-set! hash-table key
(function (hash-table-ref hash-table key thunk)))
But after loading the reference implementation into my friendly
neighbourhood Scheme REPL:
(let ()
(define (test procedure)
(let ((ht (make-hash-table)))
(hash-table-set! ht 0 'fnord)
(procedure ht)
(hash-table-ref ht 0 (lambda () #f))))
(define (update-procedure ht)
(lambda (x)
x ;ignore
(hash-table-delete! ht 0)
'foobar))
(define (do-update ht)
(hash-table-update! ht 0 (update-procedure ht) (lambda () 'lose)))
(define (do-ref-and-set ht)
(hash-table-set!
ht
0
((update-procedure ht) (hash-table-ref ht 0 (lambda () 'lose)))))
(list (test do-update)
(test do-ref-and-set)))
;Value: (#f foobar)
So it appears that the two expressions, one using HASH-TABLE-UPDATE!
and the other using HASH-TABLE-REF and HASH-TABLE-SET!, are not
equivalent in the reference implementation.