All pastes #222087 Raw Edit

Unnamed

public text v1 · immutable
#222087 ·published 2006-10-26 01:31 UTC
rendered paste body
; Support function for lambda-memo
; Convert a value to something that can be a hash key
(define hash-key
  (lambda (val) (cond
                  ((array? val) (array->vector val))
                  (else val))))

; Auto-memorizing functions
(define-macro lambda-memo
  (lambda (args . body)
    (let ((memo (gensym)) (hashed (gensym)) (key (gensym)))
      `(let ((,memo (make-hash-table 'equal)))
         (lambda ,args (let* ((,key (map hash-key (list ,@args))) (,hashed (hash-table-get ,memo ,key #f)))
                         (if ,hashed
                             ,hashed
                             (let ((,hashed (begin ,@body)))
                               (hash-table-put! ,memo ,key ,hashed)
                               ,hashed
                               )
                             )
                         )
           )
         )
      )))