2009-06-20 22 views
3

Des langues telles que Nemerle soutiennent l'idée d'accords. J'aimerais savoir quelle est leur utilité pratique.À quoi servent les accords?

+2

Je peux voir pourquoi vous posez cette question. Googling pour "C#", "accord", etc n'est vraiment pas très utile! – Noldorin

+0

Le puits C# ne supporte pas les accords, la version polyphonique l'a fait, mais je pense que le langage n'existe plus, n'est-ce pas? –

Répondre

2

La construction semble également exister dans la langue (ainsi que Polyphoniques C#), au moins selon [Wikipedia] (http://en.wikipedia.org/wiki/Chord_(concurrency).

L'utilisation principale des accords semble impliquer la programmation de base de données (plus Plus précisément, join calculus), ce qui n'a rien d'étonnant étant donné qu'il est une construction de la concurrence. Plus que cela, je crains que je ne sais pas.

2

un accord est utilisé pour la concurrence. La définition est disponible here.

Le bit que vous recherchez:

Dans la plupart des langues, y compris C#, les méthodes de la signature d'une classe sont en correspondance biunivoque avec le code de leur mise en œuvre - pour chaque méthode qui est déclarée, il y a définition unique et distincte de ce qui se passe lorsque cette méthode est appelée. En Cω, cependant, un corps peut être associé à un ensemble de méthodes (synchrones et/ou asynchrones). Nous appelons une telle définition un accord, et une méthode particulière peut apparaître dans l'en-tête de plusieurs accords. Le corps d'un accord ne peut s'exécuter que lorsque toutes les méthodes de son en-tête ont été appelées. Ainsi, lorsqu'une méthode est appelée, il peut y avoir zéro, un ou plusieurs accords activés:

Si aucun accord n'est activé, l'appel de la méthode est mis en file d'attente. Si la méthode est asynchrone, consiste simplement à ajouter les arguments (le contenu du message) à une file d'attente. Si la méthode est synchrone, le thread appelant est bloqué. S'il est un seul accord activé, alors les arguments des appels impliqués dans le match sont dé-mis en attente, tout bloqué fil impliqué dans le match est réveillé, et le corps est exécuté. Lorsqu'un accord qui implique uniquement des méthodes asynchrones s'exécute, il le fait dans un nouveau thread . S'il y a plusieurs accords qui sont activés, alors un non spécifié est choisi pour fonctionner. De même, s'il y a plusieurs appels à une méthode particulière mise en file d'attente, nous ne spécifions pas quel appel sera annulé en cas de correspondance.

2

Essayez Nemerle Calcul Expressions:

https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/ComputationExpressions/

Quelques exemples:

def upTo (n : int) 
    { 
    comp enumerable 
    { 
     mutable i = 0; 
     while (i < n) 
     { 
     i ++; 
     yield i 
     } 
    } 
    } 

    def manyTimes : IEnumerable [int] = 
    comp enumerable 
    { 
     yieldcomp upTo(2); // 1 2 
     yield 100;   // 100 
     yieldcomp upTo(3); // 1 2 3 
     yield 100;   // 100 
     yieldcomp upTo(10); // 1 2 3 .. 10 
    } 

def fn(n) 
    { 
    comp async 
    { 
     if (n < 20) 
     returncomp fn(n + 1); 
     else 
     return n; 
    } 
    } 
    def f(n1, n2) 
    { 
    comp async 
    { 
     defcomp n1 = fn(n1); 
     defcomp n2 = fn(n2); 
     return $"$n1 $n2"; 
    } 
    } 

private HttpGet(url : string) : Async[string] 
{ 
    comp async 
    { 
    def req = WebRequest.Create(url); 
    using (defcomp resp = req.AsyncGetResponse()) 
    using (stream = resp.GetResponseStream()) 
    using (reader = StreamReader(stream)) 
     return reader.ReadToEnd(); 
    } 
} 

Quelques autres exemples ici: (Bien que l'article en russe mais le code en anglais :)) http://habrahabr.ru/blogs/programming/108184/