체계에 자동 모임 작성. 매크로 및 포장지에 대한 도움
-
21-08-2019 - |
문제
스키마에 자동 모임을 작성하는 동안 몇 가지 문제에 직면하고 있습니다.
해시 테이블을 생성하고 값이 이미 계산되어 있는지 확인하는 작동 메모 저 기능이 있습니다. 이전에 계산 된 경우 값을 반환합니다. 그렇지 않으면 함수를 호출합니다.
(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)))))))
이제 다음과 같은 Memoize-Wrapper 함수를 만들고 싶습니다.
(define (memoize-wrapper function)
(set! function (memoizer function)))
그리고 Memoize-Wrapper로 기능을 정의하는 Def-Memo라는 매크로를 만들기를 바랍니다. 예를 들어. 매크로는 (Memoizer (Function-Name Arguments Body ...) 또는 이와 유사한 것으로 확장 할 수 있습니다.
할 수 있어야합니다.
(def-memo (factorial n)
(cond
((= n 1) 1)
(else (* n (factorial (- n 1))))))
정상적인 느린 대신 요인의 메모 화 된 버전을 만들어야합니다.
내 문제는
- Memoize-Wrapper가 제대로 작동하지 않으며 메모 화 된 기능이 아니라 원래 기능을 호출합니다.
- 매크로 내부에 정의를 작성하는 방법을 모르겠습니다. 가변적 인 lenght 인수와 가변 길이 본체를 얻을 수 있는지 어떻게해야합니까? 그런 다음 함수를 정의하고 메모 리자로 랩핑하려면 어떻게해야합니까?
정말 감사합니다.
해결책
이것이 제가 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)
제휴하지 않습니다 StackOverflow