cyclone/memo.scm
2019-02-14 13:58:57 -05:00

77 lines
2 KiB
Scheme

;; Temporary test file, try with the ack function
(import (scheme base)
;(srfi 69)
(scheme write))
; (define (memoize function)
; (let ((table (make-hash-table))) ;(make-equal?-map)))
; (lambda args
; (apply values
; ;(map-get table
; (hash-table-ref table
; args
; ;; If the entry isn't there, call the function.
; (lambda ()
; (call-with-values
; (lambda () (apply function args))
; (lambda results
; ;(map-put! table args results)
; (hash-table-set! table args results)
; results))))))))
;
;(define (fnc x y) (+ x y))
;(define mfnc (memoize fnc))
;
;(write (mfnc 1 1)) (newline)
;(write (mfnc 1 1)) (newline)
; Original versions:
(define (ack m n)
(cond ((= m 0) (+ n 1))
((= n 0) (ack (- m 1) 1))
(else (ack (- m 1) (ack m (- n 1))))))
(define (fib n)
(if (< n 2)
n
(+ (fib (- n 1))
(fib (- n 2)))))
;
;; Fast versions:
;(define ack (memoize _ack))
;(define (_ack m n)
; (cond ((= m 0) (+ n 1))
; ((= n 0) (ack (- m 1) 1))
; (else (ack (- m 1) (ack m (- n 1))))))
;
;(define fib (memoize _fib))
;(define (_fib n)
; (if (< n 2)
; n
; (+ (fib (- n 1))
; (fib (- n 2)))))
;
;; New fast versions that do not introduce any new top-level definitions
;(define ack
; ((lambda ()
; (define (_ack m n)
; (cond ((= m 0) (+ n 1))
; ((= n 0) (__ack (- m 1) 1))
; (else (__ack (- m 1) (__ack m (- n 1))))))
; (define __ack (memoize _ack))
; __ack
; )))
;
;(define fib
; ((lambda ()
; (define (_fib n)
; (if (< n 2)
; n
; (+ (__fib (- n 1))
; (__fib (- n 2)))))
; (define __fib (memoize _fib))
; __fib
; )))
(write (ack 3 12))
(newline)
(write (fib 40))