2011-12-11 20 views

Trả lời

9

Tôi biết thường chúng tôi yêu cầu nội dung được sao chép nhưng không có câu trả lời ngắn cho câu hỏi của bạn. http://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf

+2

Dybvig et al. giấy là một thứ tốt. Cũng có một cuộc thảo luận tốt đẹp về Lambda the Ultimate (http://lambda-the-ultimate.org/node/2971) từ một vài năm trước về việc thực hiện letrec về lambda. (Có nói tất cả điều đó, tôi đồng ý với nhận xét của sacundim rằng "chỉ vì một tính năng chức năng được thực hiện với mã bắt buộc đằng sau hậu trường, điều đó không làm cho tính năng bắt buộc".) –

8

No. Chỉ vì một tính năng chức năng được triển khai với mã bắt buộc đằng sau hậu trường, điều đó không làm cho tính năng này bắt buộc. Máy tính của chúng tôi đều bắt buộc; vì vậy tại một số điểm tất cả các mã chức năng phải được thực hiện bằng cách dịch sang mã bắt buộc!

Điều quan trọng cần hiểu ở đây là: lập trình chức năng liên quan đến giao diện , không được triển khai. Một đoạn mã có chức năng nếu chính mã đó không thể quan sát bất kỳ tác dụng phụ nào — ngay cả khi các tác dụng phụ thực tế xảy ra sau hậu trường. Tức là, nếu bạn kiểm tra giá trị của cùng một liên kết của cùng một biến nhiều lần, bạn sẽ nhận được cùng một giá trị — ngay cả khi giá trị đó, đằng sau hậu trường, được đặt ở đó bằng cách sử dụng set!.

Trong trường hợp letrec, có một chút bắt tại đây: kết quả là không xác định nếu đánh giá bất kỳ ràng buộc nào trong số letrec khiến một số khác bị hủy đăng ký. Do đó, kết quả của mã này không được xác định:

(letrec ((foo bar) 
     (bar 7)) 
    (cons foo bar)) 

Giá trị của foo trong nội dung của letrec là không xác định. Kết quả của những điều sau đây, mặt khác, được định nghĩa:

(letrec ((foo (lambda() bar)) 
     (bar 7)) 
    (cons (foo) bar)) 

Điều này là do việc đánh giá lambda nắm bắt được tham chiếu đến bar, nhưng giá trị thực tế không được ngẩng đầu lên cho đến khi đóng cửa được thực hiện trong cơ thể.

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