2009-06-30 8 views
5

Sto affrontando un paio di problemi durante la scrittura di un auto-memoizer in Scheme.Scrittura di un memoizzatore automatico in Schema. Aiuto con macro e wrapper

Ho una funzione di memoizer funzionante, che crea una tabella hash e controlla se il valore è già calcolato. Se è stato calcolato prima, restituisce il valore che chiama la funzione.

(define (memoizer fun) 
    (let ((a-table (make-hash))) 
    (λ(n) 
     (define false-if-fail (λ() #f)) 
     (let ((return-val (hash-ref a-table n false-if-fail))) 
     (if return-val 
      return-val 
      (begin 
       (hash-set! a-table n (fun n)) 
       (hash-ref a-table n))))))) 

Ora voglio creare una funzione Memoize-wrapper come questo:

(define (memoize-wrapper function) 
    (set! function (memoizer function))) 

E si spera creare una macro denominata def-memo che definisce la funzione con il Memoize-wrapper. per esempio. la macro potrebbe espandersi a (memoizer (definire la funzione nome-argomenti del corpo ...) o qualcosa di simile

Così che dovrei essere in grado di fare:.

(def-memo (factorial n) 
    (cond 
    ((= n 1) 1) 
    (else (* n (factorial (- n 1)))))) 

che dovrebbe creare una versione di memoized il fattoriale invece del normale un lento.

mio problema è che il

  1. il Memoize-involucro non funziona correttamente, si pretende molto chiamare la funzione memoized ma la funzione originaria .
  2. Non ho idea di come scrivere una definizione all'interno della macro. Come posso assicurarmi di poter ottenere argomenti di lunghezza variabile e corpo di lunghezza variabile? Come posso quindi definire la funzione e avvolgerla con il memoizer?

Grazie mille.

risposta

6

questo è quello che uso nello schema PLT:

#lang scheme 

(define (memo f) 
    (define mh (make-hash)) 
    (lambda p 
    (hash-ref mh p (lambda() 
        (hash-set! mh p (apply f p)) 
        (hash-ref mh p))))) 

(define-syntax-rule (defmemo (id . p) . body) 
    (define id (memo (lambda p . body)))) 

(provide defmemo) 
+0

WOW. È semplicemente fantastico Potresti commentare brevemente il tuo codice, in particolare il macro. Perché ci sono. ? perché hai fornito? E hai davvero bisogno di applicare? Sono un principiante. Grazie. – unj2

+1

In un elenco di parametri,. indica che la seguente variabile è associata a più di una cosa. Nella macro, p è una lista di parametri, non solo un singolo parametro (il corpo è una lista di espressioni). La stessa cosa nella funzione, è necessario applicare per applicare p, una lista di parametri, alla funzione f. –

+0

Vedere anche questo: http://planet.plt-scheme.org/display.ss?package=memoize.plt&owner=dherman –