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