2009-06-20 17 views
3

Языки, такие как Nemerle, поддерживают идею аккордов. Я хотел бы знать, что их практическое применение.Что такое аккорды?

+2

Я могу понять, почему вы задаете этот вопрос. Googling для «C#», «chord» и т. Д. Действительно не очень помогает! – Noldorin

+0

Ну C# не поддерживает аккорды, полифоническая версия сделала, но я думаю, что язык больше не существует, правильно? –

ответ

2

Конструкция также, кажется, существует в языке (а также полифонический C#), по крайней мере, в соответствии с [Wikipedia] (http://en.wikipedia.org/wiki/Chord_(concurrency).

Первичная использование аккордов, как представляется, связаны с программированием баз данных (более в частности, join calculus), что неудивительно, учитывая, что это параллельная конструкция. Более того, я боюсь, что я не знаю.

2

аккорд используется для параллелизма. определение доступно here.

бит вы ищете:

В большинстве языков, включая C#, методы в сигнатуре класса во взаимно однозначном соответствии с кодом их реализации - для каждого метода, который объявлен, существует единственное, четкое определение того, что происходит при вызове этого метода. Однако в Cω тело может быть связано с набором (синхронных и/или асинхронных) методов. Мы называем такое определение аккордом, и конкретный метод может появляться в заголовке нескольких аккордов. Тело аккорда может выполняться только после вызова всех методов в его заголовке. Таким образом, при вызове метода могут быть включены ноль, один или несколько хордов:

Если хорда не включена, вызов помещается в очередь. Если метод является асинхронным, то это просто включает в себя добавление аргументов ( содержимого сообщения) в очередь. Если метод синхронный, то вызывающий поток блокируется. Если является одним включенным аккордом, то аргументы вызовов, участвующих в совпадении , находятся в очереди, любая заблокированная нить , участвующая в матче, пробуждается , и тело запускается. Когда выполняется хор , который включает только асинхронные методы , он делает это в новом потоке . Если есть несколько аккордов , которые включены, то неуказанный один из них выбран для запуска. Аналогичным образом, если существует несколько вызовов для конкретного метода в очереди, мы не указываем, какой из вызовов будет , если очередь есть.

2

Попробуйте 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/