Domanda

Ho letto da qualche parte dove Rich Hickey diceva:

"Penso che le continuazioni potrebbero essere pulite in teoria, ma non in pratica"

Non ho familiarità con la clojure.
1.La clojure ha delle continuazioni?
2.Se no, non hai bisogno di continuazioni?Ho visto molti buoni esempi soprattutto da questo ragazzo.Qual è l'alternativa?
3.Se sì, esiste una documentazione?

È stato utile?

Soluzione

Quando si parla di continuazioni, si dovrà distinguere tra due diversi tipi di loro:

  • continuazioni di prima classe - Continuazione di supporto che è profondamente integrato nella lingua (Schema o Ruby). Clojure non supporta continuazioni di prima classe.

  • continuazione-passing-style (CPS) - CPS è solo uno stile di codifica e qualsiasi linguaggio di supporto funzioni anonime permetterà questo stile (che si applica a Clojure troppo)

  • .

Esempi:

-- Standard function
double :: Int -> Int
double x = 2 * x

-- CPS-function – We pass the continuation explicitly
doubleCPS :: Int -> (Int -> res) -> res
doubleCPS x cont = cont (2 * x)
; Call
print (double 2)

; Call CPS: Continue execution with specified anonymous function
double 2 (\res -> print res)

continuazione su Wikipedia.

Non credo che le continuazioni sono necessarie per un buon linguaggio, ma soprattutto continuazioni di prima classe e CPS in linguaggi funzionali come Haskell può essere molto utile ( intelligente esempio backtracking ).

Altri suggerimenti

Ho scritto un porto Clojure di cl-cont che aggiunge continuazioni di Common Lisp.

https://github.com/swannodette/delimc

La continuazione è una caratteristica necessaria in una lingua?

NO.Molte lingue non hanno continuazioni.

Se no, non hai bisogno di continuazioni?Ho visto molti buoni esempi soprattutto da questo ragazzo.Qual è l'alternativa?

Uno stack di chiamate

Astratto Continuazioni

Continuazioni sono una nozione astratta che vengono utilizzati per descrivere la semantica di controllo di flusso. In questo senso, entrambi esistono e non esistono (ricordate, sono astratto) in qualsiasi lingua che garantisce agli operatori di controllo (come qualsiasi linguaggio completo Turing mosto), allo stesso modo che i numeri di entrambi esistono (come entità astratte) e non esistono (come entità tangibili).

Continuazioni descrivono effetti di controllo come funzione di chiamata / ritorno, gestione delle eccezioni, e anche GOTOS. Un linguaggio fondato sarà, tra le altre cose, essere progettato con astrazioni che sono costruiti su continuazioni (ad esempio, eccezioni). (Vale a dire, un linguaggio fondato sarà composto da operatori di controllo che sono stati progettati con le continuazioni in mente. E ', ovviamente, perfettamente ragionevole per un linguaggio per esporre continuazioni come il solo astrazione di controllo , consentendo agli utenti di costruire le proprie astrazioni sulla parte superiore.)

First Class Continuazioni

Se la nozione di una continuazione è reificata come un oggetto di prima classe in una lingua, quindi abbiamo uno strumento su cui possono essere costruiti tutti i tipi di effetti di controllo. Ad esempio, se una lingua ha continuazioni di prima classe, ma non eccezioni, possiamo costruire eccezioni sulla parte superiore delle continuazioni.

Problemi con la prima classe Continuazioni

Mentre continuazioni di prima classe sono uno strumento potente e utile in molti casi, ci sono anche alcuni svantaggi esponendoli in una lingua:

  • Diversi astrazioni costruite su delle continuazioni possono causare un comportamento imprevisto / intuitivo quando composto. Ad esempio, un blocco finally potrebbe essere saltata se uso una continuazione di interrompere una computazione.
  • Se la continuazione corrente può essere richiesto in qualsiasi momento, allora la lingua di run-time deve essere strutturato in modo che sia possibile produrre un po 'di rappresentazione dei dati, la struttura della continuazione corrente in qualsiasi momento. Questo pone un certo grado di onere per il run-time per una caratteristica che, bene o male, è spesso considerato "esotico". Se la lingua è ospitato (come Clojure è ospitato sulla JVM), poi che la rappresentanza deve essere in grado di inserirsi nel quadro fornito dalla piattaforma di hosting. Ci possono essere anche altre caratteristiche di una lingua vorrebbe mantenere (ad esempio, C interoperabilità) che limitano lo spazio delle soluzioni. Problemi come questi aumentano le potenzialità di una "mancata corrispondenza impedenza", e possono gravemente complicare lo sviluppo di una soluzione performante.

Aggiunta di prima classe continuazioni ad un linguaggio

Attraverso metaprogrammazione, è possibile aggiungere il supporto per continuazioni di prima classe per una lingua. Generalmente, questo approccio implica codice trasformando lo stile continuation passante (CPS), in cui la continuazione corrente viene passato attorno come parametro esplicito di ogni funzione.

Per esempio, delimc attrezzi della biblioteca di David Nolen delimitato continuazioni di porzioni di un programma Clojure attraverso una serie di trasforma macro. In modo simile, ho scritto pulley.cps , che è un compilatore macro che trasforma codice in CPS, oltre ad libreria di runtime per supportare più fondamentali caratteristiche Clojure (come la gestione delle eccezioni) nonché interoperabilità con codice nativo Clojure.

Un problema con questo approccio è come gestire il confine tra codice nativo (Clojure) e il codice trasformato (CPS). In particolare, dal momento che non è possibile catturare la continuazione di codice nativo, è necessario o non consentire (o in qualche modo limitare) l'interoperabilità con la lingua di base o di un onere per l'utente di assicurare contesto permetterà a qualsiasi proseguimento desiderano catturare realmente essere catturato.

puleggia.cps tende verso quest'ultimo, anche se alcuni tentativi sono stati fatti per consentire all'utente di gestire questo. Per esempio, è possibile disabilitare il codice CPS chiamare in codice nativo. Inoltre, è previsto un meccanismo per fornire versioni CPS di funzioni native esistenti.

In una lingua con un sistema sufficientemente forte tipo (ad esempio Haskell), è possibile utilizzare il sistema di tipi di incapsulare calcoli che potrebbero utilizzare operazioni di controllo (cioè continuazioni) dal codice funzionalmente puro.

Sommario

Ora abbiamo le informazioni necessarie per rispondere direttamente le vostre tre domande:

  1. Clojure non supporta continuazioni di prima classe a causa di considerazioni di ordine pratico.
  2. tutte le lingue sono costruiti sulla continuazioni in senso teorico, ma alcune lingue espongono continuazioni come oggetti di prima classe. Tuttavia, è possibile aggiungere continuazioni in qualsiasi lingua tramite, ad esempio, la trasformazione in CPS.
  3. Controlla la documentazione per delimc e pulley.cps .

Un uso comune delle continuazioni è nella realizzazione di strutture di controllo per: di ritorno da una funzione, rompendo da un ciclo, gestione delle eccezioni, ecc maggior parte dei linguaggi (come Java, C ++ ecc) forniscono queste caratteristiche come parte del linguaggio di base. Alcune lingue non lo fanno (per esempio: Scheme). Invece, nelle lingue espongono continuatiions come oggetti di prima classe e lasciare che il programmatore di definire nuove strutture di controllo. Così Scheme deve essere considerato come un insieme di strumenti linguaggio di programmazione, non è una lingua completa in se stessa.

In Clojure, abbiamo quasi mai bisogno di usare direttamente continuazioni, perché quasi tutte le strutture di controllo sono forniti dal linguaggio combinazione / VM. Eppure, continuazioni di prima classe può essere un potente strumento nelle mani del programmatore competente. Soprattutto in Scheme, continuazioni sono migliori delle controparti equivalenti in altre lingue (come la coppia setjmp / longjmp in C). Questo articolo ha più dettagli su questo.

A proposito, sarà interessante sapere come Rich Hickey giustifica la sua opinione su continuazioni. Tutti i link per questo?

Clojure (o meglio clojure.contrib.monads) ha una monade prosecuzione; ecco un articolo che descrive il suo utilizzo e la motivazione .

Beh ... -> di Clojure implementa quello che cercate ... Ma con una macro invece

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top