2009-06-30 4 views
5

Je suis confronté à quelques problèmes lors de l'écriture d'un auto-mémoizer dans Scheme.Ecriture d'un auto-mémoizer dans Scheme. Aide avec une macro et un wrapper

J'ai une fonction mémoizer qui crée une table de hachage et vérifie si la valeur est déjà calculée. Si elle a été calculée auparavant, elle renvoie la valeur qu'elle appelle la fonction.

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

Maintenant, je veux créer une fonction memoize-wrapper comme ceci:

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

Et nous espérons créer une macro appelée def-mémo qui définit la fonction avec le memoize-emballage. par exemple. la macro pourrait étendre à (memoizer (définir corps arguments nom-fonction ...) ou quelque chose comme ça

Alors que je devrais être en mesure de le faire.

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

qui devrait créer une version de memoized le factoriel au lieu de la lente normale.

Mon problème est que le

  1. le memoize-emballage ne fonctionne pas correctement, il ne marche pas appeler la fonction memoized mais la fonction d'origine .
  2. Je n'ai aucune idée de comment écrire une définition à l'intérieur de la macro. Comment puis-je m'assurer que je peux obtenir des arguments de longueur variable et un corps de longueur variable? Comment puis-je définir la fonction et l'entourer avec le mémoizer?

Merci beaucoup.

Répondre

6

ce que j'utilise dans le schéma de 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. C'est juste génial. Pourriez-vous brièvement commenter votre code en particulier le bit macro. Pourquoi y a-t-il ? pourquoi avez-vous fourni? Et avez-vous vraiment besoin de postuler? Je suis un débutant. Merci. – unj2

+1

Dans une liste de paramètres,. indique que la variable suivante est liée à plus d'une chose. Dans la macro, p est une liste de paramètres, pas seulement un seul param (le corps est une liste d'expressions). Même chose dans la fonction, appliquer est nécessaire pour appliquer p, une liste de paramètres, à la fonction f. –

+0

Voir aussi: http://planet.plt-scheme.org/display.ss?package=memoize.plt&owner=dherman –