3

Nemerle 等语言支持和弦的概念。我想知道它们的实际用途是什么。

4

3 回答 3

2

和弦用于并发。该定义可在此处获得。

您正在寻找的位:

在包括 C# 在内的大多数语言中,类签名中的方法与其实现的代码是双射对应的——对于声明的每个方法,都有一个单独的、不同的定义来说明调用该方法时会发生什么。然而,在 Cω 中,主体可能与一组(同步和/或异步)方法相关联。我们把这样的定义称为和弦,一个特定的方法可能出现在几个和弦的标题中。和弦的主体只能在其标头中的所有方法都被调用后才能执行。因此,当调用一个方法时,可能会启用零个、一个或多个和弦:

如果没有启用和弦,则方法调用将排队。如果该方法是异步的,那么这只需将参数(消息的内容)添加到队列中。如果方法是同步的,则调用线程被阻塞。如果有一个启用的和弦,则匹配中涉及的调用的参数被取消排队,匹配中涉及的任何阻塞线程都被唤醒,并且主体运行。当一个只涉及异步方法的和弦运行时,它会在一个新线程中运行。如果启用了多个和弦,则选择其中未指定的一个来运行。类似地,如果对特定方法的多个调用排队,我们不会指定在匹配时哪个调用将出队。

于 2009-06-21T02:37:59.173 回答
2

至少根据 [Wikipedia]( http://en.wikipedia.org/wiki/Chord_(concurrency) ),该结构似乎也存在于语言(以及 Polyphonic C#)中。

和弦的主要用途似乎涉及数据库编程(更具体地说,连接演算),鉴于它是一种并发构造,这并不奇怪。更何况,恐怕我不知道。

于 2009-06-20T17:07:50.753 回答
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/

于 2011-03-08T08:55:28.750 回答