mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-15 16:57:35 +02:00
41 lines
1.2 KiB
Scheme
41 lines
1.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)
|
|
|
|
(define (ack m n)
|
|
(cond ((= m 0) (+ n 1))
|
|
((= n 0) (ack (- m 1) 1))
|
|
(else (ack (- m 1) (ack m (- n 1))))))
|
|
(write
|
|
(ack 3 12))
|
|
|
|
(define mack (memoize _mack))
|
|
(define (_mack m n)
|
|
(cond ((= m 0) (+ n 1))
|
|
((= n 0) (mack (- m 1) 1))
|
|
(else (mack (- m 1) (mack m (- n 1))))))
|
|
(write
|
|
(_mack 3 12))
|