2009-06-30 10 views
5

Mam do czynienia z kilkoma problemami podczas pisania auto-memoizera na Schemacie.Pisanie auto-memoizera na Schemacie. Pomoc z makrami i opakowaniem

Mam działającą funkcję pamięci, która tworzy tabelę skrótów i sprawdza, czy wartość jest już obliczona. Jeśli wcześniej została obliczona, zwraca wartość, którą wywołuje funkcję.

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

Teraz chcę utworzyć funkcję memoize-wrapper tak:

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

I mamy nadzieję stworzyć makro o nazwie def-memo który określa funkcję z memoize-owijki. na przykład. makro mogła rozwinąć się (memoizer (define nazwa-funkcji argumenty ciała ...) lub coś takiego

więc, że powinienem być w stanie to zrobić.

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

które powinny tworzyć memoized wersję silnia zamiast normalnego powolny.

Moim problemem jest to, że

  1. memoize-wrapper nie działa prawidłowo, to nie robi wywołać memoized funkcji, ale oryginalną funkcję .
  2. Nie mam pojęcia, jak napisać definicję wewnątrz makra. Jak upewnić się, że mogę uzyskać argumenty o zmiennej długości i ciało o zmiennej długości? Jak mogę następnie zdefiniować funkcję i owijać ją za pomocą narzędzia do zapisywania notatek?

Wielkie dzięki.

Odpowiedz

6

to co mogę używać w systemie 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. To jest po prostu niesamowite. Mógłbyś krótko skomentować swój kod, szczególnie makro. Dlaczego tam są. ? dlaczego zapewniałeś? Czy naprawdę chcesz się zgłosić? Jestem nowicjuszem. Dzięki. – unj2

+1

Na liście parametrów,. wskazuje, że następująca zmienna jest powiązana z więcej niż jedną rzeczą. W makrze p jest listą paramów, a nie tylko pojedynczym parametrem (treść jest listą wyrażeń). To samo w funkcji, należy zastosować, aby zastosować p, listę parametrów, do funkcji f. –

+0

Zobacz także: http://planet.plt-scheme.org/display.ss?package=memoize.plt&owner=dherman –