2009-06-30 7 views
5

Tengo un par de problemas al escribir un auto-memoizer en Scheme.Escribiendo un auto-memoizer en Scheme. Ayuda con macro y un contenedor

Tengo una función de memoria de trabajo, que crea una tabla hash y comprueba si el valor ya está calculado. Si se ha calculado antes, devuelve el valor, de lo contrario, llama a la función.

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

Ahora quiero crear una función memoize-envoltura de la siguiente manera:

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

Y es de esperar crear una macro llamada def-memo que define la función con el memoize-envoltura. p.ej. la macro podría expandirse a (memoizer (definir nombre-función argumentos cuerpo ...) o algo así

Así que yo debería ser capaz de hacer:.

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

que debe crear una versión de memoized el factorial en lugar de la lenta normal.

Mi problema es que el

  1. el memoize-envoltorio no está funcionando adecuadamente, eso no llamar a la función memoized pero la función original .
  2. No tengo idea de cómo escribir una definición dentro de la macro. ¿Cómo puedo asegurarme de que puedo obtener argumentos de longitud variable y cuerpo de longitud variable? ¿Cómo puedo definir la función y envolverla con el memo- rizador?

Muchas gracias.

Respuesta

6

esto es lo que yo uso en el esquema 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. Eso es simplemente increíble. Podría comentar brevemente su código especialmente el bit de macro. Por qué hay . ? ¿por qué me proporcionaste? ¿Y realmente necesitas postularte? Soy un novato Gracias. – unj2

+1

En una lista de parámetros,. indica que la siguiente variable está vinculada a más de una cosa. En la macro, p es una lista de params, no solo un solo param (body es una lista de expresiones). Lo mismo en la función, aplicar es necesario para aplicar p, una lista de parámetros, a la función f. –

+0

Vea también esto: http://planet.plt-scheme.org/display.ss?package=memoize.plt&owner=dherman –

Cuestiones relacionadas