Sprachen wie Nemerle unterstützen die Idee von Akkorden. Ich würde gerne wissen, was ihre praktische Verwendung ist.Was sind Akkorde?
Antwort
Das Konstrukt auch
in der Cω Sprache (sowie polyphone C#), zumindest nach [Wikipedia] ( http://en.wikipedia.org/wiki/Chord_(concurrency). Zu existieren scheintDie primäre Verwendung von Akkorde Datenbankprogrammierung einzubinden erscheint (mehr insbesondere join calculus), das nicht weiter überrascht, dass es eine Gleichzeitigkeit Konstrukt ist. Mehr als das, ich fürchte, ich weiß nicht.
ein Akkord für Parallelität verwendet wird. Die Definition here zur Verfügung.
Das Bit Sie suchen:
In den meisten Sprachen, einschließlich C#, Methoden in der Unterzeichnung einer Klasse sind in Bijektion mit dem Code ihrer Implementierungen - für jedes Verfahren, das erklärt wird, gibt es ein einzelne, eindeutige Definition dessen, was passiert, wenn diese Methode aufgerufen wird. In C & ohgr; kann jedoch ein Körper mit einer Menge von (synchronen und/oder asynchronen) Verfahren assoziiert sein. Wir nennen eine solche Definition einen Akkord, und eine bestimmte Methode kann in der Kopfzeile mehrerer Akkorde erscheinen. Der Akkordkörper kann nur ausgeführt werden, wenn alle Methoden in seinem Header aufgerufen wurden. Wenn eine Methode aufgerufen wird, können daher null, eine oder mehrere Akkorde aktiviert sein:
Wenn kein Akkord aktiviert ist, wird die Methode aufgerufen. Wenn die Methode asynchron ist, dann beinhaltet das einfach das Hinzufügen der Argumente (der Inhalt der Nachricht) zu einer Warteschlange. Wenn die Methode synchron ist, ist der aufrufende Thread blockiert. Wenn ein einzelner aktivierter Akkord ist, werden die Argumente der Aufrufe, die in der Übereinstimmung enthalten sind, aus der Warteschlange entfernt, jeder blockierte Thread, der an der Übereinstimmung beteiligt ist, wird geweckt und der Körper wird ausgeführt. Wenn ein Akkord, der nur asynchrone Methoden beinhaltet, läuft, dann tut es dies in einem neuen Thread. Wenn mehrere Akkorde aktiviert sind, dann wird eine nicht spezifizierte einer davon ausgewählt, um zu laufen. Wenn mehrere Anrufe zu einer bestimmten Methode in der Warteschlange sind, geben wir nicht an, welcher Anruf de-queued wird, wenn es eine Übereinstimmung gibt.
Versuchen Nemerle Computation Expressions:
https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/ComputationExpressions/
Einige Beispiele:
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();
}
}
Einige weitere Beispiele hier: (Obwohl Artikel auf Russisch, aber Code in Englisch :)) http://habrahabr.ru/blogs/programming/108184/
Ich kann sehen, warum Sie diese Frage stellen. Googeln nach "C#", "Akkord" etc. ist wirklich nicht sehr hilfreich! – Noldorin
Well C# unterstützt keine Akkorde, die polyphone Version hat das, aber ich denke, dass Sprache nicht mehr existiert, oder? –