2010-06-03 32 views
14

Tôi đang làm bài tập về nhà, nơi chúng tôi được yêu cầu thực hiện chiến lược đánh giá có tên "gọi theo tên" bằng một ngôn ngữ nhất định mà chúng tôi đã phát triển (sử dụng Đề án)."Gọi theo tên" là gì?

Chúng tôi đã nhận được example in Scala, nhưng tôi không hiểu cách "gọi theo tên" hoạt động và cách khác "gọi bằng nhu cầu"?

Trả lời

23

Gọi theo nhu cầu là phiên bản ghi nhớ từng cuộc gọi (xem wikipedia).

Trong cuộc gọi theo tên, đối số được đánh giá mỗi lần được sử dụng, trong khi gọi theo nhu cầu, nó được đánh giá lần đầu tiên được sử dụng và giá trị được ghi lại để sau đó cần không được đánh giá lại.

+0

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

+0

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

9

Gọi theo tên là một lược đồ truyền tham số trong đó tham số được đánh giá khi được sử dụng, không phải khi hàm được gọi. Dưới đây là ví dụ trong pseudo-C:

int i; 
char array[3] = { 0, 1, 2 }; 

i = 0; 
f(a[i]); 

int f(int j) 
{ 
    int k = j; // k = 0 
    i = 2;  // modify global i 
    k = j;  // The argument expression (a[i]) is re-evaluated, giving 2. 
} 

Biểu thức đối số được đánh giá lazily khi sử dụng các giá trị hiện tại của biểu thức đối số.

+0

Đánh giá lười biếng được đánh giá nhiều nhất một lần, gọi theo tên được đánh giá bằng không, một hoặc nhiều lần. –

+0

không nhất thiết phải: http://en.wikipedia.org/wiki/Lazy_evaluation –

+0

Tôi không biết về Đề án, nhưng trong Scala (không có tham số lười), sự khác biệt đó hoàn toàn chính xác. –

2

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. 
+0

'delay' và' force' là r5rs, mặc dù? trên thực tế, ít nhất là cũ như r3rs. –

+0

@sgm có, chúng là một phần của tiêu chuẩn. Tôi chỉ muốn cho thấy làm thế nào họ có thể được thực hiện. –

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