Clojure có tiếp tục / coroutines / vv?


20

Tôi bắt đầu lập trình với Python và tôi thực sự bối rối bởi các khái niệm như coroutines và đóng cửa.

Bây giờ tôi nghĩ rằng tôi biết họ ở một mức độ hời hợt, nhưng tôi chưa bao giờ cảm thấy khoảnh khắc "giác ngộ" đó, vì vậy tôi chọn học Clojure. Tôi đã mua cuốn sách của Stuart Halloway và nó rất hay, nhưng khi tôi nhìn vào mục lục thì không có từ nào như coroutine hay tiếp tục. Tôi googled họ, nhưng cũng không có gì ở đó.

Vì vậy, câu hỏi của tôi là:

Clojure có tiếp tục hoặc coroutines để thực hiện các nhiệm vụ như bóng bàn mà không bị tràn ngăn xếp không?

Ví dụ về Python (mặc dù Python tiêu chuẩn không hỗ trợ phiên bản đầy đủ tính năng của coroutine đối xứng này):

def ping():
  while 1:
   print "ping"
   function to switching to pong

def pong():
  while 1:
   function to switching to ping
   print "pong"

Câu trả lời:


20

Clojure không có cuộc gọi / cc, nhưng dù sao bạn cũng không muốn tiếp tục không bị giới hạn.

Chúng tôi lập luận chống lại call/ccnhư là một tính năng ngôn ngữ cốt lõi, vì hoạt động kiểm soát phân biệt để thực hiện việc từ bỏ tất cả những thứ khác về thư viện. Nguyên thủy call/cclà một sự trừu tượng xấu - theo nhiều nghĩa khác nhau của 'xấu' được hiển thị bên dưới, - và việc nó tiếp tục toàn bộ chương trình không thực sự hữu ích. Phần thưởng duy nhất cho công việc khó khăn để nắm bắt toàn bộ tiếp tục một cách hiệu quả là công việc khó khăn hơn để có được xung quanh việc nắm bắt toàn bộ tiếp tục. Cả người dùng và người triển khai đều được phục vụ tốt hơn với một tập hợp các nguyên thủy kiểm soát được lựa chọn tốt ở nhiều mức độ khác nhau với các tương tác được cân nhắc kỹ lưỡng ...

... Cung cấp call/ccnhư một tính năng kiểm soát cốt lõi trong đó tất cả các cơ sở kiểm soát khác nên được triển khai hóa ra một ý tưởng tồi. Hiệu suất, rò rỉ bộ nhớ và tài nguyên, dễ thực hiện, dễ sử dụng, dễ lý luận tất cả các tranh luận chống lại call/cc. Nếu thực sự có một tính năng điều khiển nổi bật để thực hiện như một nguyên thủy, với những tính năng khác được đưa vào thư viện, thì không call/cc.

David Nolen đã viết một thư viện tiếp tục phân định cho Clojure. Hãy thử nó!

phân định

Một thư viện tiếp tục được phân tách cho Clojure 1.4.0 (và 1.3.0). Các phần dựa trên cl-cont của Slava Akhmechet ( http://defmacro.org ) ...


2

Mặc dù Clojure không có các phần tiếp theo hoặc coroutines hạng nhất được tích hợp làm tính năng cốt lõi, nhưng có thể thực hiện phần của riêng bạn.

Ví dụ, core.async là thư viện Clojure thực hiện mô hình CSP (Quy trình tuần tự đồng thời). Nó sử dụng một gomacro để chuyển đổi mã bên trong thành một máy trạng thái. Mặc dù không chính xác coroutines per se, nó có thể được sử dụng để thực hiện các mẫu tương tự.

Ngoài ra còn có pulley.cps , một trình biên dịch macro mà tôi đã tạo ra để chuyển đổi (thông qua cps/ cps-fnmacro) Mã Clojure được viết theo kiểu trực tiếp thành kiểu chuyển tiếp. Theo hiểu biết tốt nhất của tôi, nó là chương trình Clojure theo chủ đề hoàn chỉnh nhất. Nó hỗ trợ ràng buộc động, các trường hợp ngoại lệ, gọi qua lại giữa mã gốc và mã được chuyển đổi (mặc dù việc tiếp tục không được duy trì trên các bối cảnh). Hiện tại, chỉ có các phần tiếp theo phá thai (nghĩa là truyền thống call-cc) được hỗ trợ, nhưng tôi có kế hoạch thực hiện các phần tiếp theo được phân định trong tương lai.

Trong khi pulley.cps không trực tiếp cung cấp coroutines mỗi se, với call-cc nhưng nó tương đối đơn giản để thực hiện của riêng bạn. Trong thực tế, một trong những ví dụ là việc thực hiện đa nhiệm hợp tác đơn giản . Điều này được xây dựng thêm trong ví dụ CSP . Ngoài ra còn có một ví dụ Ping-Pong , nhưng đó là một ví dụ về tối ưu hóa cuộc gọi đuôi hơn là coroutines.

Tất nhiên, các loại biến đổi này có hiệu quả nhất khi áp dụng cho toàn bộ chương trình. Thật không may, điều này là không thể với các macro, được bản địa hóa. Tuy nhiên, ngay cả các biến đổi cục bộ có thể rất hiệu quả.


1

Clojure có tiếp tục hoặc coroutines để thực hiện các nhiệm vụ như bóng bàn mà không bị tràn ngăn xếp không?

Câu hỏi cũ, vì vậy tôi thậm chí không chắc liệu tính năng này có sẵn tại thời điểm đó hay không, nhưng đối với bất kỳ ai muốn thực hiện bất kỳ loại chức năng "bóng bàn" nào, hãy xem trampoline !

Tôi mới phát hiện ra nó như một câu trả lời cho câu hỏi của tôi về Phong cách tiếp tục hiệu quả trong Clojure, tại đây: /programming/50952443/contininating-passing-style-does-not-seem-to-make-a -difference-in-clojure / 50955276 # 50955276 và tôi nghĩ đó chỉ là công việc. Tôi đã nghe về nó một thời gian trước đây, nhưng chưa bao giờ điều tra đầy đủ. Thêm đánh lừa tôi. Không giống như nhiều giải pháp đề xuất khác, nó chỉ hoạt động .

====== PS. Tải thông tin hướng dẫn trực tuyến,] đây là một số ít tôi thấy hữu ích


1
có thể liên kết trampoline để chỉ đến tài liệu?
esoterik ngày
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.