和弦有什么用途?

3

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


2
我能理解你为什么会问这个问题。在谷歌上搜索“c#”、“和弦”等并不是很有帮助! - Noldorin
C#不支持和弦,Polyphonic版本支持,但我认为那种语言已经不存在了,对吧? - Dmitri Nesteruk
3个回答

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/

2

根据[Wikipedia](http://en.wikipedia.org/wiki/Chord_(concurrency))的说法,这种构造在语言(以及Polyphonic C#)中似乎也存在。

和弦的主要用途似乎涉及数据库编程(更具体地说,是join calculus),这并不奇怪,因为它是一种并发构造。除此之外,我恐怕不太清楚。


2
一个chord用于并发。定义可以在这里找到。
你要找的部分:
在大多数语言中,包括C#,类签名中的方法与其实现代码具有双射对应关系 - 对于声明的每个方法,在调用该方法时会有一个单独且不同的定义。但是,在Cω中,一个body可以与一组(同步和/或异步)方法相关联。我们将这样的定义称为chord,并且特定的方法可能会出现在多个chord的头部。当所有header中的方法都被调用后,chord的body才能执行。因此,当调用方法时,可能会启用零个、一个或多个chord:
如果没有启用任何chord,则方法调用将排队等待。如果方法是异步的,则这只涉及将参数(消息的内容)添加到队列中。如果方法是同步的,则调用线程被阻塞。如果有一个启用的chord,则匹配涉及的调用的参数将被出队列,任何参与匹配的阻塞线程将被唤醒,并且body运行。当涉及仅异步方法的chord运行时,它会在新线程中运行。如果存在多个启用的chord,则会选择其中一个运行。同样,如果有多个调用特定方法的排队等待,则当进行匹配时我们不指定将出队哪个调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接