; 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 ) ) ) ) ) )))