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
- el memoize-envoltorio no está funcionando adecuadamente, eso no llamar a la función memoized pero la función original .
- 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.
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
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. –
Vea también esto: http://planet.plt-scheme.org/display.ss?package=memoize.plt&owner=dherman –