2009-06-30 8 views
5

Ich habe ein paar Probleme beim Schreiben eines Auto-Memoizers in Scheme.Schreiben eines automatischen Memoizers in Schema. Hilfe mit Makro und einem Wrapper

Ich habe eine funktionierende Memoizer-Funktion, die eine Hash-Tabelle erstellt und prüft, ob der Wert bereits berechnet ist. Wenn es zuvor berechnet wurde, gibt es den Wert zurück, sonst ruft es die Funktion auf.

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

Jetzt möchte ich eine memoize-Wrapper-Funktion wie folgt erstellen:

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

Und hoffentlich ein Makro def-Memo genannt erstellen, die die Funktion mit dem memoize-Wrapper definiert. z.B. das Makro könnte (memoizer (function-name Argument Körper ...) oder so ähnlich erweitern definiert

Damit ich in der Lage zu tun sein sollte.

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

, die eine memoized Version erstellen sollte die Fakultäts anstelle der normalen langsamen.

Mein Problem ist, dass die

  1. die memoize-Wrapper nicht richtig funktioniert, ist es die memoized Funktion aufrufen, tut aber die ursprüngliche Funktion .
  2. Ich habe keine Ahnung, wie man eine Definition innerhalb des Makros schreibt. Wie stelle ich sicher, dass ich Argumente mit variabler Länge und variabler Länge erhalten kann? Wie definiere ich dann die Funktion und umschlinge sie mit dem Memoizer?

Vielen Dank.

Antwort

6

das ist, was ich in PLT-Schema verwenden:

#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. Das ist einfach großartig. Könnten Sie Ihren Code kurz kommentieren, insbesondere das Makro-Bit? Warum sind da . ? Warum hast du zur Verfügung gestellt? Und musst du dich wirklich bewerben? Ich bin ein Neuling. Vielen Dank. – unj2

+1

In einer Parameterliste,. gibt an, dass die folgende Variable an mehr als eine Sache gebunden ist. In dem Makro ist p eine Liste von Parametern, nicht nur ein einzelner Parameter (Körper ist eine Liste von Ausdrücken). Das Gleiche gilt für die Funktion apply, die für die Anwendung von p, einer Liste von Parametern, auf die Funktion f benötigt wird. –

+0

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