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