Языки, такие как Nemerle, поддерживают идею аккордов. Я хотел бы знать, что их практическое применение.Что такое аккорды?
ответ
Конструкция также, кажется, существует в Cω языке (а также полифонический C#), по крайней мере, в соответствии с [Wikipedia] (http://en.wikipedia.org/wiki/Chord_(concurrency).
Первичная использование аккордов, как представляется, связаны с программированием баз данных (более в частности, join calculus), что неудивительно, учитывая, что это параллельная конструкция. Более того, я боюсь, что я не знаю.
аккорд используется для параллелизма. определение доступно here.
бит вы ищете:
В большинстве языков, включая C#, методы в сигнатуре класса во взаимно однозначном соответствии с кодом их реализации - для каждого метода, который объявлен, существует единственное, четкое определение того, что происходит при вызове этого метода. Однако в Cω тело может быть связано с набором (синхронных и/или асинхронных) методов. Мы называем такое определение аккордом, и конкретный метод может появляться в заголовке нескольких аккордов. Тело аккорда может выполняться только после вызова всех методов в его заголовке. Таким образом, при вызове метода могут быть включены ноль, один или несколько хордов:
Если хорда не включена, вызов помещается в очередь. Если метод является асинхронным, то это просто включает в себя добавление аргументов ( содержимого сообщения) в очередь. Если метод синхронный, то вызывающий поток блокируется. Если является одним включенным аккордом, то аргументы вызовов, участвующих в совпадении , находятся в очереди, любая заблокированная нить , участвующая в матче, пробуждается , и тело запускается. Когда выполняется хор , который включает только асинхронные методы , он делает это в новом потоке . Если есть несколько аккордов , которые включены, то неуказанный один из них выбран для запуска. Аналогичным образом, если существует несколько вызовов для конкретного метода в очереди, мы не указываем, какой из вызовов будет , если очередь есть.
Попробуйте Nemerle Исчисление выражения:
https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/ComputationExpressions/
Некоторые примеры:
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();
}
}
Некоторые примеры здесь: (хотя статья на русском языке, но код на английском языке :)) http://habrahabr.ru/blogs/programming/108184/
Я могу понять, почему вы задаете этот вопрос. Googling для «C#», «chord» и т. Д. Действительно не очень помогает! – Noldorin
Ну C# не поддерживает аккорды, полифоническая версия сделала, но я думаю, что язык больше не существует, правильно? –