2009-06-30 24 views
5

Tôi đang gặp phải một số sự cố khi viết tự động ghi nhớ trong Đề án.Viết tự động ghi nhớ trong Đề án. Trợ giúp về macro và trình bao bọc

Tôi có chức năng ghi nhớ hoạt động, tạo một bảng băm và kiểm tra xem giá trị đã được tính chưa. Nếu nó đã được tính toán trước khi nó trả về giá trị khác nó gọi hàm.

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

Bây giờ tôi muốn tạo một hàm memoize-wrapper như thế này:

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

Và hy vọng tạo một macro gọi def-bản ghi nhớ trong đó xác định các chức năng với memoize-wrapper. ví dụ. vĩ mô có thể mở rộng ra (memoizer (define function-name lập luận cơ thể ...) hoặc một cái gì đó như thế

Vì vậy mà tôi sẽ có thể làm:.

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

mà nên tạo một phiên bản memoized của giai thừa thay cho một chậm bình thường.

vấn đề của tôi là

  1. các memoize-wrapper không hoạt động đúng, nó không gọi hàm memoized nhưng chức năng ban đầu .
  2. Tôi không biết cách viết một định nghĩa bên trong macro. Làm cách nào để đảm bảo rằng tôi có thể nhận được các đối số chiều dài biến và thân độ dài thay đổi? Làm thế nào để sau đó xác định chức năng và quấn nó xung quanh với memoizer?

Cảm ơn rất nhiều.

Trả lời

6

đây là những gì tôi sử dụng trong chương trình 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. Điều đó thật tuyệt vời. Bạn có thể nhận xét ngắn gọn mã của bạn đặc biệt là bit macro không. Tại sao lại có. ? tại sao bạn cung cấp? Và bạn có thực sự cần áp dụng không? Tôi là một người mới. Cảm ơn. – unj2

+1

Trong danh sách tham số,. chỉ ra rằng biến sau đây bị ràng buộc với nhiều hơn một điều. Trong macro, p là danh sách các tham số, không chỉ một tham số đơn lẻ (thân là danh sách các biểu thức). Điều tương tự trong hàm, áp dụng là cần thiết để áp dụng p, một danh sách các tham số, cho hàm f. –

+0

Xem thêm điều này: http://planet.plt-scheme.org/display.ss?package=memoize.plt&owner=dherman –

Các vấn đề liên quan