Какая польза от аккордов? - PullRequest
3 голосов
/ 20 июня 2009

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

Ответы [ 3 ]

2 голосов
/ 21 июня 2009

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

Бит, который вы ищете:

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

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

2 голосов
/ 08 марта 2011

Попробуйте выражения вычисления 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/

2 голосов
/ 20 июня 2009

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

).

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

...