Clojure'da süreklilikler / couteinler / vb. Var mı?


20

Python ile programlamaya başladım ve coroutines ve kapanışlar gibi kavramlarla gerçekten şaşırdım.

Şimdi onları yüzeysel düzeyde tanıdığımı düşünüyorum, ama bu "aydınlanma" anını hiç hissetmedim, bu yüzden Clojure öğrenmeyi tercih ediyorum. Kitabı Stuart Halloway'dan satın aldım ve iyi, ama dizine baktığımda coroutine veya devam gibi kelimeler yoktu. Onları aradım, ama orada da hiçbir şey yok.

Benim sorum şu:

Clojure'da yığın taşması olmadan ping-ponging gibi görevleri yerine getirmek için süreklilikler veya eşgüdümler var mı?

Python örneği (standart Python, bu simetrik koroutinin tam özellikli bir sürümünü desteklemese de):

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

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

Yanıtlar:


20

Clojure'da çağrı / cc yoktur, ancak yine de sınırsız devam etmek istemezsiniz .

call/ccDiğerlerini kütüphanelere yerel olarak devretmek için seçkin kontrol operasyonu olarak temel bir dil özelliği olarak tartışıyoruz . İlkel call/ccbir olan kötü soyutlama aşağıda 'kötü' çeşitli anlamları -, - ve bütün programın devamında da yakalama pratik açıdan yararlı değildir. Tüm sürekliliği verimli bir şekilde yakalamak için sıkı çalışmanın tek ödülü, tüm sürekliliği yakalamak için daha zor bir iştir. Hem kullanıcılar hem de uygulayıcılar, iyi düşünülmüş etkileşimlerle çeşitli genel derecelerde iyi seçilmiş bir dizi kontrol ilkesi ile daha iyi servis edilir ...

... call/ccDiğer tüm kontrol tesislerinin uygulanması gereken temel bir kontrol özelliği olarak sunulması kötü bir fikirdir. Performans, bellek ve kaynak sızıntıları, uygulama kolaylığı, kullanım kolaylığı, tüm akıl yürütme kolaylığı tartışılmaktadır call/cc. İlkel olarak uygulanacak gerçekten seçkin bir kontrol özelliği varsa, diğerleri kütüphanelere dahil edildiğinde, öyle değildir call/cc.

David Nolen , Clojure için sınırlı bir devam kütüphanesi yazdı . Denemek!

delimc

Clojure 1.4.0 (ve 1.3.0) için sınırlandırılmış bir devam kütüphanesi. Slava Akhmechet'in cl-cont tabanlı bölümleri ( http://defmacro.org ) ...


2

Clojure'un temel bir özellik olarak yerleşik birinci sınıf devamları veya eşgüdümleri olmasa da, kendi uygulamanızı uygulamak mümkündür.

Örneğin, core.async , CSP (Eşzamanlı Sıralı İşlemler) modelini uygulayan bir Clojure kütüphanesidir. goİçindeki kodu bir durum makinesine dönüştürmek için bir makro kullanır . Tam olarak coroutines olmasa da, aynı desenleri uygulamak için kullanılabilir.

Orada da pulley.cps makro derleyici ben dönüşümler (via olduğunu yazmış ettik cps/ cps-fnmakrolar) Clojure kod devamı geçirme tarzı haline doğrudan tarzında yazılmıştır. Bildiğim kadarıyla, en eksiksiz devam temalı Clojure programı. Dinamik bağlama, istisnalar, yerel ve dönüştürülmüş kod arasında ileri geri çağrıları destekler (ancak, bağlamlar boyunca sürdürülmez). Şu anda, sadece düşük süreklilikler (yani geleneksel call-cc) desteklenmektedir, ancak gelecekte sınırlandırılmış süreklilikleri uygulama planlarım var.

Pulley.cps doğrudan kendi başına coroutinler sağlamazken call-cc, kendi uygulamanızı uygulamak nispeten basittir. Aslında, örneklerden biri kooperatif çoklu görevinin basit bir uygulamasıdır . Bu, CSP örneğinde daha da geliştirilmiştir. Bir Ping-Pong örneği de var, ancak bu, coroutines'den ziyade kuyruk çağrısı optimizasyonunun bir örneğidir.

Tabii ki, bu tür dönüşümler tüm programa uygulandığında en etkilidir. Ne yazık ki, bu yalnızca yerelleştirilmiş makrolarla mümkün değildir. Yine de, yerelleştirilmiş dönüşümler bile çok etkili olabilir.


1

Clojure'da yığın taşması olmadan ping-ponging gibi görevleri yerine getirmek için süreklilikler veya eşgüdümler var mı?

Eski soru, bu yüzden bu özelliğin o anda mevcut olup olmadığından bile emin değilim, ancak "ping-pong" işlevselliğini her türlü uygulamak isteyen herkes için trambolin kontrol edin !

Clojure'da verimli Devam Eden Stil hakkındaki sorumun cevabı olarak buldum, burada: /programming/50952443/continuation-passing-style-does-not-seem-to-make-a - fark-içinde-clojure / 50955276 # 50955276 ve bence bu sadece iş. Bir süre önce duymuştum, ama hiçbir zaman tam olarak araştırmadım. Beni daha aptal yerine koy. Diğer önerilen çözümlerin çoğundan farklı olarak, sadece çalışır .

====== PS. Öğretici bilgi çevrimiçi bir sürü,] burada yararlı buldum birkaç


1
trambolin belgelere işaret etmek için belki linkify ?
esoterik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.