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
- memoize-wrapper nie działa prawidłowo, to nie robi wywołać memoized funkcji, ale oryginalną funkcję .
- 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.
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
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. –
Zobacz także: http://planet.plt-scheme.org/display.ss?package=memoize.plt&owner=dherman –