2009-06-30 4 views
5

Scheme에 자동 메모 작성자를 쓰는 중 몇 가지 문제가 있습니다.Scheme에 자동 메모 작성하기. 매크로 및 래퍼 도움말

해시 테이블을 만들고 값이 이미 계산되었는지 확인하는 작업 메모 기능이 있습니다. 그 전에 계산 된 경우 함수를 호출하는 다른 값을 반환합니다.

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

을 그리고 희망 memoize - 래퍼로 함수를 정의 DEF-메모라는 매크로를 만들 :

(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 - 래퍼 함수를 ​​만들려고합니다. 예. 매크로 (memoizer (에 확장처럼 함수 이름 인수 본체 ...) 또는 뭔가를 정의 할 수

을 그래서 내가 할 수있을 것을 :.의 memoized 버전을 만들어야합니다

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

대신 정상 느린 하나의 계승.

내 문제가

  1. memoize - 래퍼가 제대로 작동되지 않는 것입니다, 그것은 memoized 기능을하지만 원래의 함수를 호출 나던 .
  2. 매크로 내부에 정의를 작성하는 방법을 알지 못합니다. 변수 길이 인수 및 가변 길이 본문을 가져올 수 있는지 어떻게 확인합니까? 그런 다음 함수를 정의하고 메모 작성자와 함께 랩핑하려면 어떻게해야합니까?

고마워요.

답변

6

이 내가 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. 그것은 단지 굉장합니다. 간단히 매크로 비트에 대한 코드를 간단히 설명해 주시겠습니까? 왜 거기에 있습니다. ? 왜 당신은 제공 했습니까? 그리고 정말로 신청해야합니까? 나는 초보자입니다. 감사. – unj2

+1

매개 변수 목록에서. 다음 변수가 둘 이상의 것에 바인딩되어 있음을 나타냅니다. 매크로에서 p는 단일 매개 변수가 아니라 매개 변수 목록입니다 (본문은 식 목록 임). 함수에서와 동일한 것은, 함수 f에 params의리스트 인 p를 적용하는 것이 필요합니다. –

+0

이것도 참조하십시오 : http://planet.plt-scheme.org/display.ss?package=memoize.plt&owner=dherman –