2010-09-28 19 views
13

Có ai biết nếu call/cc có thể được triển khai chỉ với lambdas và đóng cửa không?Có thể thực hiện cuộc gọi tiếp tục với hiện tại chỉ với lambdas và đóng cửa không?

Dường như call/cc ngắt dòng chảy của chương trình (như ngoại lệ) nhưng lambdas và đóng cửa không thể thực hiện điều đó. Vì vậy tôi nghĩ rằng call/cc không thể được thực hiện thông qua lambdas và đóng cửa.

Có thêm ý tưởng nào nữa không?

+3

Không, để được hỗ trợ tiếp tục hoàn toàn (không phải là những ảnh đơn lẻ), bạn sẽ cần xếp chồng và đống. Tất cả điều này xảy ra ở mức rất thấp. – leppie

+1

@leppie Tôi rất vui khi được nêu lên như một câu trả lời. –

+0

@Frank Shearar: Tôi sẽ làm tôi thực sự đã thực hiện thành công chúng :) Tiếp tục khó, chúng ta hãy đi mua sắm! – leppie

Trả lời

12

Câu hỏi không rõ ràng, vì chính xác "thực hiện chỉ với lambdas và đóng cửa" có nghĩa là gì?

Trong mọi trường hợp, có thể sử dụng tiếp tục bằng bất kỳ ngôn ngữ nào có đóng bằng cách viết theo cách thủ công trong continuation passing style. Sau đó dịch tự động vào biểu mẫu này có thể được thực hiện bằng cách mở rộng trình biên dịch, mà Lisps thường cho phép trên cấp độ người dùng thông qua các macro. Ví dụ: xem cl-cont, một thư viện triển khai các liên tục cho Common Lisp, một ngôn ngữ không được tích hợp sẵn.

Tiếp tục lan tỏa hiệu quả như trong Đề án có thể được thực hiện ở mức thấp hơn trực tiếp đối phó với chương trình ngăn xếp, nhưng đây không phải là một yêu cầu, chỉ là một tối ưu hóa.

+0

CPS sẽ chỉ hoạt động nếu ngôn ngữ cơ bản hỗ trợ các cuộc gọi đuôi (mà nó nên, trong trường hợp của Đề án). – leppie

+4

Nói chung là đúng, nhưng về nguyên tắc bạn có thể quét khung ngăn xếp theo cách thủ công bằng cách trả về sự tiếp tục và đối số lên trên cho một số vòng lặp "Trình điều khiển CPS". – Ramarren

+3

CPS sẽ hoạt động, nhưng vấn đề là nó hoạt động * chỉ * đối với mã mà bạn kiểm soát (và có thể CPS). Ví dụ, đối phó với các thư viện trở nên khó khăn, vì bạn cần phải đối xử với họ như các cuộc gọi nước ngoài, ngay cả khi họ đang ở trong ngôn ngữ của bạn. (Và BTW, những "vòng điều khiển SPC" này thường được gọi là tampolining.) –

11

Trong sơ đồ, bạn có thể triển khai call/cc sử dụng lambda khi chuyển sang kiểu chuyển tiếp liên tục (CPS). Khi chuyển đổi thành CPS, mỗi lần xuất hiện của call/cc có thể được thay thế bằng tương đương như sau:

(lambda (f k) (f (lambda (v k0) (k v)) k)) 

nơi k là việc tiếp tục được cứu rỗi, và (lambda (v k0) (k v)) là thủ tục thoát mà phục hồi tiếp tục này (bất cứ điều gì tiếp tục k0 đang hoạt động khi nó được gọi, bị loại bỏ).

Vì vậy, để trả lời câu hỏi của bạn cho Đề án: có, nó có thể được thực hiện.

+0

Đây có phải là cách gọi/cc thường được thực hiện trên ngôn ngữ tối ưu hóa cuộc gọi đuôi như Scheme? Là macro? – Byte

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