Question

Je lis quelque part où Hickey riche dit:

  

"Je pense que continuations pourrait être soignée   en théorie, mais pas en pratique »

Je ne suis pas familier avec Clojure.
1. Est-ce que Clojure ont continuations?
2. Si non, ne vous avez besoin continuations? Je l'ai vu beaucoup de bons exemples en particulier de ce type . Quelle est l'alternative?
3. Si oui, est-il une documentation?

Était-ce utile?

La solution

Quand on parle de continuations, vous devrez faire la distinction entre deux types d'entre eux différents:

  • continuations de première classe - Poursuite de soutien qui est profondément intégrée dans la langue (schéma ou Ruby). Clojure ne supporte pas les continuations de première classe.

  • style de passage de continuation (CPS) - CPS est juste un style de codage et de tout langage supportant des fonctions anonymes permettra ce style (qui applique à Clojure aussi)

  • .

Exemples:

-- 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)

Lire la suite sur Wikipedia.

Je ne pense pas que continuations sont nécessaires pour une bonne langue, mais surtout continuations de première classe et CPS dans les langages fonctionnels comme Haskell peut être très utile ( exemple intelligente faire marche arrière ).

Autres conseils

J'ai écrit un port Clojure de cl-suite qui ajoute continuations Common Lisp.

https://github.com/swannodette/delimc

  

est la continuation d'une caractéristique nécessaire dans une langue?

Non. Beaucoup de langues ne pas continuations.

  

Si non, vous avez besoin DonT continuations? Je l'ai vu beaucoup de bons exemples en particulier de ce type. Quelle est l'alternative?

Une pile d'appels

Résumé continuations

continuations sont une notion abstraite qui sont utilisés pour décrire la sémantique de flux de contrôle. En ce sens, ils existent à la fois et n'existent pas (rappelez-vous, ils sont abstraits) dans toutes les langues qui offre aux opérateurs de contrôle (comme toute langue complète doit Turing), de la même manière que les nombres existent deux (comme des entités abstraites) et n'existent pas (comme des entités tangibles).

Les continuations décrivent les effets de contrôle tels que l'appel / retour fonction, la gestion des exceptions, et même GOTO. entre autres Un langage bien-fondé sera, être conçu avec des abstractions qui sont construites sur continuations (par exemple, les exceptions). (C'est-à-dire un langage bien fondé sera composé des opérateurs de contrôle qui ont été conçus avec continuations à l'esprit. Il est, bien sûr, tout à fait raisonnable pour une langue pour exposer continuations comme que abstraction de contrôle , ce qui permet aux utilisateurs de construire leurs propres abstractions sur le dessus.)

First Class continuations

Si la notion de continuation est réifié comme un objet de première classe une langue, nous avons un outil sur lequel toutes sortes d'effets de contrôle peuvent être construits. Par exemple, si une langue a continuations de première classe, mais pas des exceptions, nous pouvons construire des exceptions au-dessus de continuations.

Problèmes avec continuations de première classe

Alors que continuations de première classe sont un outil puissant et utile dans de nombreux cas, il y a aussi des inconvénients à les exposer dans une langue:

  • Les différentes abstractions construites sur des continuations peut entraîner un comportement inattendu / unintuitive quand composé. Par exemple, un bloc de finally peut être ignorée si j'utilise une continuation pour interrompre un calcul.
  • Si la poursuite actuelle peut être demandée à tout moment, l'exécution de la langue doit être structuré de telle sorte qu'il est possible de produire une représentation structure de données de la poursuite en cours à tout moment. Cela place un certain degré de charge sur l'exécution d'une fonction qui, pour le meilleur ou pour le pire, est souvent considéré comme « exotique ». Si la langue est hébergé (comme Clojure est hébergé sur la machine virtuelle Java), alors que la représentation doit pouvoir tenir dans le cadre fourni par la plate-forme d'hébergement. Il peut aussi y avoir d'autres caractéristiques d'une langue souhaite maintenir (par exemple, C) Interop qui limitent l'espace de solution. Des questions telles que celles-ci augmentent le potentiel d'un « non-concordance d'impédance », et peut sérieusement compliquer le développement d'une solution performante.

Ajout continuations de première classe à une langue

Par métaprogrammation, il est possible d'ajouter le support pour les continuations de première classe à une langue. En général, cette approche implique la transformation du code de style de passage de continuation (CPS), dans lequel la poursuite actuelle est passé autour comme un argument explicite à chaque fonction.

Par exemple, David Nolen de bibliothèque delimc des outils de parties délimitées continuations d'un programme Clojure par une série de macro. transforme Dans la même veine, je suis l'auteur pulley.cps , qui est un compilateur macro qui transforme code dans CPS, ainsi qu'une bibliothèque d'exécution pour supporter plusieurs caractéristiques essentielles Clojure (telles que la gestion des exceptions), ainsi que l'interopérabilité avec le code natif Clojure.

Un problème avec cette approche est la façon dont vous gérez la frontière entre le code natif (Clojure) et le code transformé (CPS). Plus précisément, puisque vous ne pouvez pas saisir la continuation du code natif, vous devez soit désavouer (ou en quelque sorte restreindre) Interop avec la langue de base ou un fardeau pour l'utilisateur d'assurer le contexte permettra une poursuite qu'ils souhaitent saisir à fait être capturé.

poulie

.cps tend vers ce dernier, bien que certaines tentatives ont été faites pour permettre à l'utilisateur de gérer cela. Par exemple, il est possible de désavouer le code CPS pour remettre en code natif. En outre, un mécanisme est prévu pour fournir des versions CPS des fonctions natives existantes.

Dans une langue avec un système de type suffisamment forte (comme Haskell), il est possible d'utiliser le système de type pour encapsuler les calculs qui pourraient utiliser les opérations de contrôle (à savoir, continuations) à partir du code fonctionnel pur.

Résumé

Nous avons maintenant les informations nécessaires pour répondre directement à vos trois questions:

  1. Clojure ne supporte pas les continuations de première classe pour des raisons pratiques.
  2. Toutes les langues sont construites sur continuations au sens théorique, mais quelques langues exposent continuations comme des objets de première classe. Cependant, il est possible d'ajouter à une langue continuations via, par exemple, la transformation en CPS.
  3. Consultez la documentation delimc et / ou pulley.cps .

Une utilisation courante de continuations est dans la mise en œuvre des structures de contrôle pour: le retour d'une fonction, la rupture d'une boucle, la gestion des exceptions, etc. La plupart des langues (comme Java, C ++, etc.) fournissent ces caractéristiques dans le cadre de la langue de base. Certaines langues ne le font pas (par exemple: schéma). Au lieu de cela, ces langues exposent continuatiions comme objets de première classe et permettre au programmeur de définir de nouvelles structures de contrôle. Ainsi, le schéma devrait être considéré comme une boîte à outils de langage de programmation, pas un langage complet en soi.

Dans Clojure, nous avons besoin presque jamais utiliser directement continuations, parce que presque toutes les structures de contrôle sont fournis par la langue / combinaison VM. Pourtant, première continuations de classe peut être un outil puissant dans les mains du programmeur compétent. Surtout dans le schéma, continuations sont meilleurs que les homologues équivalents dans d'autres langues (comme la paire setjmp / longjmp en C). Cet article a plus détails à ce sujet.

BTW, il sera intéressant de savoir comment Rich Hickey justifie son opinion sur continuations. Tous les liens pour cela?

Clojure (ou plutôt clojure.contrib.monads) a une monade de continuation; est ici un article qui décrit son utilisation et la motivation .

Eh bien ... la -> de Clojure implémente ce que vous recherchez ... Mais avec une macro à la place

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top