(define memo (make-hash-table 'equal))
(define (memoize force-update func . params)
(define (update-value func params)
(let ((ret-value (apply func params)))
(hash-table-put! memo (apply list (cons func params)) ret-value)
ret-value))
(if force-update
(update-value func params)
(let ((memo-get (hash-table-get memo (apply list (cons func params)) #:void)))
(if (eq? #:void memo-get)
(update-value func params)
memo-get))))
(memoize #f <func> <arg1> <argn> ...) ;; returns cached version
(memoize #t <func> <arg1> <argn> ...) ;; refreshes the cache(define (memoize force-update func . params)
(define (update-value func params)
(let ((ret-value (apply func params)))
(hash-table-put! memo (apply list (cons func params)) ret-value)
ret-value))
(if force-update
(update-value func params)
(hash-table-get memo
(apply list (cons func params))
(lambda () (update-value func params)))))(define (memoize force-update func . params)
(define (update-value func params)
(let ((ret-value (apply func params)))
(hash-table-put! memo (apply list (cons func params)) ret-value)
ret-value))
(if force-update
(update-value func params)
(with-handlers ((void (lambda (exn) (update-value func params))))
(hash-table-get memo (apply list (cons func params))))))