Чи має Clojure продовження / супроводи / тощо?


20

Я почав програмувати з Python, і мене дуже збентежили такі поняття, як супроводи та закриття.

Тепер я думаю, що знаю їх на якомусь поверхневому рівні, але я ніколи не відчував цього "просвітницького" моменту, тому вирішу вчитися Клуджуре. Я купив книгу Стюарта Хэллоуей, і це добре, але коли я подивився на індекс, не було таких слів, як корект або продовження. Я гуглив їх, але там теж нічого немає.

Отже, моє питання:

Чи має Clojure продовження чи розширення для виконання таких завдань, як ping-poging без переповнення стека?

Приклад Python (хоча стандартний Python не підтримує повнофункціональну версію цієї симетричної програми):

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

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

Відповіді:


20

У Clojure немає дзвінка / куб.см., але ви все одно не бажаєте непередбаченого продовження .

Ми сперечаємось call/ccяк основна особливість мови, як видатна операція керування для втілення в життя власних релегацій усіх інших бібліотек. Примітив call/cc- це погана абстракція - у різних значеннях "поганого", показаних нижче, - і її захоплення продовження всієї програми практично не корисне. Єдина винагорода за важку роботу за ефективне захоплення цілого продовження - це більш наполеглива робота, щоб обійти цілий продовження. Як користувачі, так і реалізатори краще обслуговувати набір добре підібраних контрольних примітивів різного ступеня загальності з добре продуманими взаємодіями ...

... Пропозиція call/ccяк основна функція управління, з точки зору якої слід реалізувати всі інші засоби управління, виявляється поганою ідеєю. Продуктивність, витоки пам’яті та ресурсів, простота впровадження, простота використання, простота міркувань - всі суперечать call/cc. Якщо дійсно є одна відмітна функція управління, яку можна реалізувати як примітив, а інші передаються в бібліотеки, це не так call/cc.

Девід Нолен написав розмежувану бібліотеку продовжень для Clojure. Спробуй!

розмежувати

Розмежена бібліотека продовжень для Clojure 1.4.0 (та 1.3.0). Частини на основі cl-cont від Slava Akhmechet ( http://defmacro.org ) ...


2

Хоча Clojure не має першокласного продовження чи вбудованих процедур як основної функції, можна реалізувати власну.

Наприклад, core.async - бібліотека Clojure, яка реалізує модель CSP (паралельні послідовні процеси). Він використовує goмакрос для перетворення коду в стан машини. Хоча саме це не є суто процедурами, воно може бути використане для реалізації тих же моделей.

Існує також pulley.cps , макрос-компілятор, який я створив, який перетворює (через cps/ cps-fnмакроси) код Clojure, написаний у прямому стилі, у стиль передачі продовження. Наскільки мені відомо, це найповніша програма тематики Clojure. Він підтримує динамічну прив'язку, винятки, дзвінки вперед і назад між нативними і перетвореними кодами (хоча продовження не підтримується в контекстах). На даний момент підтримуються лише переривання активності (тобто традиційні call-cc), але я маю плани впроваджувати обмежене продовження в майбутньому.

У той час як pulley.cps безпосередньо не надає суто процедур, але call-ccреалізувати свої власні рішення досить просто. Насправді, одним із прикладів є проста реалізація кооперативного багатозадачності . Це далі опирається на прикладі ДСП . Також є приклад Ping-Pong , але це більше приклад оптимізації хвостових викликів, ніж спрощення.

Звичайно, такі види перетворень найбільш ефективні при застосуванні до всієї програми. На жаль, це неможливо лише з макросами, які локалізуються. Однак навіть локалізовані перетворення можуть бути дуже ефективними.


1

Чи має Clojure продовження чи розширення для виконання таких завдань, як ping-poging без переповнення стека?

Старе питання, тому я навіть не впевнений, чи була ця функція доступна в той час, але для тих, хто хоче реалізувати будь-яку функцію «пінг-понг», ознайомтеся з батутом !

Я щойно відкрив це як відповідь на моє запитання щодо ефективного стилю продовження в Clojure, тут: /programming/50952443/continuation-passing-style-does-not-seem-to-make-a -difference-in-clojure / 50955276 # 50955276, і я думаю, що це просто робота. Я чув про це деякий час тому, але ніколи не досліджував повністю. Більш обдурити мене. На відміну від багатьох інших запропонованих рішень, воно просто працює .

====== PS. Інформація про навчальний посібник в Інтернеті,], ось кілька мені здаються корисними


1
можливо, зв’язати батут, щоб вказати на документацію?
esoterik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.