Thêm câu trả lời này vào câu trả lời ở trên:
Làm việc thông qua SICP section on Streams. Nó cung cấp cho một lời giải thích tốt của cả hai gọi-by-tên và gọi-by-cần. Nó cũng cho thấy làm thế nào để thực hiện những người trong Đề án. BTW, nếu bạn đang tìm kiếm một giải pháp nhanh chóng ở đây là lời kêu gọi-by-nhu cầu cơ bản thực hiện trong Đề án:
;; Returns a promise to execute a computation. (implements call-by-name)
;; Caches the result (memoization) of the computation on its first evaluation
;; and returns that value on subsequent calls. (implements call-by-need)
(define-syntax delay
(syntax-rules()
((_ (expr ...))
(let ((proc (lambda() (expr ...)))
(already-evaluated #f)
(result null))
(lambda()
(if (not already-evaluated)
(begin
(display "computing ...") (newline)
(set! result (proc))
(set! already-evaluated #t)))
result)))))
;; Forces the evaluation of a delayed computation created by 'delay'.
(define (my-force proc) (proc))
Một mẫu chạy:
> (define lazy (delay (+ 3 4)))
> (force lazy)
computing ... ;; Computes 3 + 4 and memoizes the result.
7
> (my-force lazy)
7 ;; Returns the memoized value.
Nguồn
2010-06-03 05:09:20
tôi đã đã thực hiện cuộc gọi bằng nhu cầu, và khi tôi đã thực hiện việc triển khai đầu tiên là không có bộ nhớ đệm, tôi không có ý nghĩa với tôi rằng giáo sư yêu cầu tôi làm điều gì đó mà tôi đã làm, bởi vì tôi muốn hiểu sự khác biệt thực sự giữa cuộc gọi theo nhu cầu và gọi theo tên – forellana
tôi xác nhận với giáo sư, đó là gọi bằng tên, tôi đã nhầm lẫn bởi vì chúng tôi đã viết mã đó và bây giờ anh ta yêu cầu chúng tôi một lần nữa cho rằng – forellana