Il Clojure ha continuazioni / coroutine / etc?

16

Ho iniziato a programmare con Python, ed ero davvero confuso da concetti come coroutine e chiusure.

Ora penso di conoscerli a un livello superficiale, ma non ho mai sentito quel momento di "ravvicinamento", quindi ho scelto di imparare Clojure. Ho comprato il libro di Stuart Halloway ed è buono, ma quando ho guardato l'indice non c'erano parole come coroutine o continuazione. Li ho cercati su google, ma non c'è niente neanche lì.

Quindi la mia domanda è:

Clojure ha continuazioni o coroutine per svolgere attività come ping-pong senza uno stack overflow?

Esempio di Python (sebbene Python standard non supporti una versione completa di questa coroutine simmetrica):

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

def pong():
  while 1:
   function to switching to ping
   print "pong"
    
posta Novice 18.08.2012 - 04:42
fonte

3 risposte

17

Clojure non ha call / cc, ma non vuoi comunque continuazioni <1a>.

We argue against call/cc as a core language feature, as the distinguished control operation to implement natively relegating all others to libraries. The primitive call/cc is a bad abstraction -- in various meanings of 'bad' shown below, -- and its capture of the continuation of the whole program is not practically useful. The only reward for the hard work to capture the whole continuation efficiently is more hard work to get around the capture of the whole continuation. Both the users and the implementors are better served with a set of well-chosen control primitives of various degrees of generality with well thought-out interactions...

...Offering call/cc as a core control feature in terms of which all other control facilities should be implemented turns out a bad idea. Performance, memory and resource leaks, ease of implementation, ease of use, ease of reasoning all argue against call/cc. If there is really one distinguished control feature to implement as a primitive, with others relegated into libraries, it is not call/cc.

David Nolen ha scritto una libreria di continuazioni delimitate per Clojure. Provalo!

delimc

A delimited continuations library for Clojure 1.4.0 (and 1.3.0). Portions based on cl-cont by Slava Akhmechet (http://defmacro.org)...

    
risposta data 18.08.2012 - 10:06
fonte
1

Sebbene Clojure non abbia continuazioni di prima classe o coroutine incorporate come funzionalità di base, è possibile implementarle da sole.

Ad esempio, core.async è una libreria Clojure che implementa il modello CSP (Concurrent Sequential Processes). Usa una macro go per trasformare il codice all'interno di una macchina a stati. Sebbene non sia esattamente coroutine di per sé, può essere utilizzato per implementare gli stessi schemi.

C'è anche pulley.cps , un compilatore di macro che ho scritto che trasforma (tramite cps / cps-fn macros) Clojure codice scritto in stile diretto in stile passaggio continuo. Per quanto ne so, è il programma Clojure a continuazione più completo. Supporta l'associazione dinamica, le eccezioni, il richiamo tra codice nativo e codice trasformato (sebbene la continuazione non sia mantenuta in tutti i contesti). Al momento, sono supportate solo continuazioni abortive (ad esempio call-cc tradizionale), ma ho in programma di implementare continuazioni delimitate in futuro.

Mentre pulley.cps non fornisce direttamente le coroutine di per sé, con call-cc è relativamente semplice implementare la tua. In effetti, uno degli esempi è una semplice implementazione di multitasking cooperativo . Questo è ulteriormente sviluppato nell'esempio CSP . C'è anche un esempio Ping-Pong , ma è più un esempio di ottimizzazione della coda di chiamata rispetto alle coroutine.

Naturalmente, questi tipi di trasformazioni sono più efficaci se applicati all'intero programma. Sfortunatamente, questo non è possibile con le sole macro, che sono localizzate. Tuttavia, anche le trasformazioni localizzate possono essere molto efficaci.

    
risposta data 12.05.2016 - 06:49
fonte
0

Does Clojure have continuations or coroutines to do tasks like ping-ponging without a stack overflow?

Vecchia domanda, quindi non sono nemmeno sicuro se questa funzione fosse disponibile al momento, ma per chiunque volesse implementare qualsiasi tipo di funzionalità "ping-pong", controlla trampoline

L'ho appena scoperto come una risposta alla mia domanda su uno stile di passaggio continuo continuo in Clojure, qui: link e penso che sia solo il lavoro. Ne avevo sentito parlare un po 'di tempo fa, ma non ho mai indagato completamente. Più ingannare me. A differenza di molte altre soluzioni proposte, è funziona .

====== PS. Carichi di informazioni di esercitazione in linea,] qui sono alcuni che ho trovato utile

risposta data 20.06.2018 - 22:30
fonte

Leggi altre domande sui tag