2010-07-25 77 views
8

Trong nguyên tắc của tôi về lớp lập trình, chúng ta đang nói về các phương thức gọi khác nhau. Một số chúng tôi đã thảo luận là:Ví dụ về Cuộc gọi theo tên

  • gọi bằng giá trị
  • cuộc gọi bằng cách tham khảo
  • gọi bằng giá trị/dẫn
  • gọi theo tên

tôi không thể tìm thấy một ví dụ cách gọi theo tên hoạt động. Bất cứ ai quan tâm để cho tôi một ví dụ? Tôi nghĩ rằng khi bạn lấy tệp xml làm đầu vào, đây là tương tự để gọi theo tên. Ai đó có thể cho tôi một ví dụ truyền thống hơn không?

+0

Tôi không biết về bất kỳ ví dụ hiện đại gọi bằng tên. Đó là một ý tưởng rất tồi tệ trong ALGOL 60, và tôi nghi ngờ điều đó đã thay đổi. –

+0

Bạn đang tìm kiếm loại ví dụ nào? Ví dụ về ngôn ngữ sử dụng từng tên hoặc ví dụ về việc đánh giá biểu thức bằng cách sử dụng từng tên sẽ trông như thế nào? – sepp2k

+1

@ sepp2k, cả hai đều có thể hữu ích. Tôi không chắc chắn, nhưng từ những gì tôi đã tìm ra cho đến nay nó có vẻ như một ý tưởng khá chết (đúng tôi nếu tôi sai) nhưng nó được bao gồm trong tài liệu khóa học (có lẽ chỉ vì lý do lịch sử?) – sixtyfootersdude

Trả lời

9

Tôi sẽ làm việc bằng ngôn ngữ lập trình giả định. Giả sử chúng ta có một hàm p(x) để in ra x và sau đó trả về nó. Bây giờ chúng ta hãy định nghĩa một hàm:

function foo(x, y) { return y+1; } 

Bây giờ chúng ta hãy gọi nó với một số đối số:

foo(p(123),p(456)) 

xy sẽ được thay thế cho các thông số, vì vậy cuộc gọi đến foo trên sẽ cho kết quả in:

return p(456)+1; 

Vì vậy, chúng tôi sẽ in 456 vào màn hình và trả lại 457. Trong một chiến lược đánh giá khác, chúng tôi sẽ đánh giá lần đầu tiên sử dụng các tham số chức năng (in 123 và 456 cho màn hình trong quá trình) và sau đó thay thế 456 cho y trong thân chức năng, cuối cùng quay trở lại 457.

Nó được tạo ra, nhưng tôi hy vọng bạn sẽ có ý tưởng. Đó là tất cả về sự thay thế.

+0

vì vậy sẽ gọi tên cũng gọi điện thoại bằng cách tham khảo? giá trị? Bất cứ điều gì cụ thể? – sixtyfootersdude

+0

@sixtyfootersdude, câu đó làm cho bộ não của tôi bị tổn thương. Chăm sóc để tái khẳng định nó? – Gian

+0

Chắc chắn. Giả sử bạn có điều này (** Gọi theo tên **): 'int x = 0; foo (t (x)); in (x); 'nếu nó đã được * cũng *" gọi theo giá trị "điều này sẽ in 0. Nếu nó được * cũng *" gọi bằng cách tham khảo "nó * có thể * in cái gì khác. – sixtyfootersdude

2

http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_name

Trong cuộc gọi bằng giá trị, bạn đánh giá lập luận, lấy giá trị mà sau đó được truyền cho hàm. foo(bar()) được đánh giá là arg = bar();, sau đó foo (arg) được gọi, và trong cơ thể của hàm, biến arg mới phân bổ này có thể truy cập, sửa đổi, ...

Trong cuộc gọi bằng tên, bạn substitues trong cơ thể của hàm bất kỳ tham chiếu đến đối số nào bằng mã được sử dụng trong suốt cuộc gọi. Sau đó, đánh giá cơ thể, bạn sẽ đánh giá các đối số. foo(bar()) với foo(arg) { return arg; } sẽ được đánh giá như foo(arg) { return bar(); }

1

Gọi theo tên làm việc như cuộc gọi bằng cách tham khảo khi tham số thực tế được scaler, nhưng phải khác nhau khi tham số thực tế là biểu hiện hoặc mảng tham số sau đó thực tế là tái đánh giá trên mỗi lần truy cập.

đây là ví dụ đơn giản

begin 
    integer n; 
    procedure p(k: integer); 
     begin 
     print(k); 
     n := n+1; 
     print(k); 
     end; 
    n := 0; 
    p(n+10); 
    end; 
  • cuộc gọi bằng cách ra giá trị => 10 10
  • cuộc gọi bằng cách sản lượng name => 10 11
+0

tôi thấy ví dụ này ở nơi khác, bạn nên trích dẫn –