Clojure มีการต่อเนื่อง / coroutines / etc หรือไม่?


20

ฉันเริ่มเขียนโปรแกรมด้วย Python และฉันสับสนกับแนวคิดอย่างเช่น coroutines และ closures

ตอนนี้ฉันคิดว่าฉันรู้จักพวกเขาในระดับตื้น ๆ แต่ฉันไม่เคยรู้สึกว่าช่วงเวลา "สว่าง" ดังนั้นฉันเลือกเรียน Clojure ฉันซื้อหนังสือของ Stuart Halloway และมันก็ดี แต่เมื่อฉันดูที่ดัชนีไม่มีคำพูดใด ๆ เช่น coroutine หรือความต่อเนื่อง ฉัน googled พวกเขา แต่ก็ไม่มีอะไรที่นั่น

ดังนั้นคำถามของฉันคือ:

Clojure มีการต่อเนื่องหรือ coroutines ในการทำงานเช่น pong-ponging โดยไม่ล้นกอง?

ตัวอย่าง Python (แม้ว่า Python มาตรฐานไม่รองรับเวอร์ชันเต็มรูปแบบของ coroutine สมมาตรนี้):

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

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

คำตอบ:


20

Clojure ไม่มีการเรียก / cc แต่คุณไม่ต้องการการเชื่อมต่อที่ไม่ จำกัด

เราแย้งcall/ccว่าเป็นคุณลักษณะภาษาหลักเนื่องจากการดำเนินการควบคุมที่โดดเด่นเพื่อนำไปใช้ในการผลักไสคนอื่น ๆ ทั้งหมดไปยังห้องสมุด ดึกดำบรรพ์call/ccเป็นนามธรรมที่ไม่ดี - ในความหมายต่าง ๆ ของ 'ไม่ดี' ที่แสดงด้านล่าง - และการจับภาพความต่อเนื่องของโปรแกรมทั้งหมดไม่มีประโยชน์ในทางปฏิบัติ รางวัลเดียวสำหรับการทำงานอย่างหนักเพื่อจับภาพความต่อเนื่องทั้งหมดอย่างมีประสิทธิภาพคือการทำงานอย่างหนักเพื่อให้ได้ภาพการถ่ายภาพต่อเนื่องทั้งหมด ทั้งผู้ใช้และผู้ใช้งานจะได้รับบริการที่ดีขึ้นด้วยชุดการควบคุมแบบดั้งเดิมที่ได้รับการแต่งตั้งอย่างดีในระดับทั่วไปที่มีการโต้ตอบที่ดี

... การเสนอให้call/ccเป็นคุณสมบัติการควบคุมหลักในแง่ที่ว่าสิ่งอำนวยความสะดวกการควบคุมอื่น ๆ ทั้งหมดควรถูกนำมาใช้นั้นเป็นความคิดที่ไม่ดี call/ccผลการปฏิบัติงานหน่วยความจำและทรัพยากรการรั่วไหลของความสะดวกในการดำเนินงานที่ใช้งานง่ายสะดวกในการให้เหตุผลทั้งหมดเถียงกับ ถ้ามีจริงๆหนึ่งคุณลักษณะการควบคุมที่โดดเด่นในการดำเนินการเป็นดั้งเดิมกับคนอื่น ๆ call/ccผลักไสเข้าไปในห้องสมุดก็เป็นได้

David Nolen เขียนห้องสมุดต่อเนื่องที่มีตัวคั่นสำหรับ Clojure ลอง!

delimc

คลังความต่อเนื่องแบบ จำกัด เขตสำหรับ Clojure 1.4.0 (และ 1.3.0) บางส่วนตาม cl-cont โดย Slava Akhmechet ( http://defmacro.org ) ...


2

ในขณะที่ Clojure ไม่ได้มีการต่อเนื่องชั้นหนึ่งหรือ coroutines ในตัวเป็นคุณสมบัติหลักมันเป็นไปได้ที่จะใช้งานของคุณเอง

ตัวอย่างเช่นcore.asyncเป็นไลบรารี Clojure ที่ใช้โมเดล CSP (Concurrent Sequential Processes) มันใช้goแมโครในการแปลงรหัสภายในเป็นเครื่องรัฐ แม้ว่าจะไม่ได้ coroutines ต่อ se แต่ก็สามารถใช้เพื่อนำรูปแบบเดียวกันมาใช้

นอกจากนี้ยังมีpulley.cpsซึ่งเป็นคอมไพเลอร์มาโครที่ฉันเขียนว่าแปลง (ผ่านcps/ cps-fnมาโคร) โค้ด Clojure ที่เขียนในรูปแบบโดยตรงเป็นรูปแบบการส่งต่อ เพื่อความรู้ที่ดีที่สุดของฉันมันเป็นโปรแกรม Clojure ที่มีธีมต่อเนื่องที่สมบูรณ์แบบที่สุด รองรับการเชื่อมโยงไดนามิกข้อยกเว้นการโทรกลับไปกลับมาระหว่างโค้ดเนทีฟและโค้ดที่แปลงสภาพ (แม้ว่าความต่อเนื่องจะไม่ถูกรักษาข้ามบริบท) ในขณะนี้รองรับการยกเลิกต่อเนื่อง (เช่นดั้งเดิมcall-cc) เท่านั้น แต่ฉันมีแผนที่จะใช้การดำเนินการต่อเนื่องที่คั่นด้วยในอนาคต

ในขณะที่ pulley.cps ไม่ได้จัดเตรียม coroutines ต่อ se โดยตรงด้วยcall-ccมันค่อนข้างตรงไปตรงมาที่จะใช้งานของคุณเอง ในความเป็นจริงตัวอย่างหนึ่งคือการใช้งานมัลติทาสกิ้งแบบร่วมมืออย่างง่าย สิ่งนี้ถูกสร้างเพิ่มเติมในตัวอย่างCSP นอกจากนี้ยังมีตัวอย่างPing-Pongแต่มันเป็นตัวอย่างของการเพิ่มประสิทธิภาพการโทรหางมากกว่า coroutines

แน่นอนว่าการแปลงรูปแบบเหล่านี้มีประสิทธิภาพมากที่สุดเมื่อใช้กับโปรแกรมทั้งหมด น่าเสียดายที่แมโครนี้ไม่สามารถทำได้ซึ่งมีการแปลเป็นภาษาท้องถิ่น ถึงกระนั้นการแปลงรูปภาษาท้องถิ่นก็ยังมีประสิทธิภาพมาก


1

Clojure มีการต่อเนื่องหรือ coroutines ในการทำงานเช่น pong-ponging โดยไม่ล้นกอง?

คำถามเก่าดังนั้นฉันไม่แน่ใจด้วยซ้ำว่าคุณสมบัตินี้มีให้บริการในเวลานั้นหรือไม่ แต่สำหรับทุกคนที่ต้องการใช้ฟังก์ชั่น "ping-pong" ใด ๆ ให้ลองใช้แทรมโพลีน !

ฉันเพิ่งค้นพบว่ามันเป็นคำตอบสำหรับคำถามของฉันเกี่ยวกับรูปแบบการส่งต่ออย่างมีประสิทธิภาพใน Clojure ที่นี่: /programming/50952443/continuation-passing-style-does-not-seem-to-make-a -difference-in-clojure / 50955276 # 50955276 และฉันคิดว่ามันเป็นแค่งาน ฉันได้ยินมาพักหนึ่งแล้ว แต่ไม่เคยตรวจสอบอย่างเต็มที่ หลอกฉันมากกว่านี้ แตกต่างจากโซลูชันที่เสนออื่น ๆ มากมายมันใช้งานได้

====== PS โหลดข้อมูลการสอนออนไลน์] นี่คือสิ่งที่ฉันพบว่ามีประโยชน์


1
อาจจะเชื่อมโยงแทรมโพลีนให้ชี้ไปที่เอกสารหรือไม่
esoterik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.