Nemerle 等语言支持和弦的概念。我想知道它们的实际用途是什么。
3 回答
和弦用于并发。该定义可在此处获得。
您正在寻找的位:
在包括 C# 在内的大多数语言中,类签名中的方法与其实现的代码是双射对应的——对于声明的每个方法,都有一个单独的、不同的定义来说明调用该方法时会发生什么。然而,在 Cω 中,主体可能与一组(同步和/或异步)方法相关联。我们把这样的定义称为和弦,一个特定的方法可能出现在几个和弦的标题中。和弦的主体只能在其标头中的所有方法都被调用后才能执行。因此,当调用一个方法时,可能会启用零个、一个或多个和弦:
如果没有启用和弦,则方法调用将排队。如果该方法是异步的,那么这只需将参数(消息的内容)添加到队列中。如果方法是同步的,则调用线程被阻塞。如果有一个启用的和弦,则匹配中涉及的调用的参数被取消排队,匹配中涉及的任何阻塞线程都被唤醒,并且主体运行。当一个只涉及异步方法的和弦运行时,它会在一个新线程中运行。如果启用了多个和弦,则选择其中未指定的一个来运行。类似地,如果对特定方法的多个调用排队,我们不会指定在匹配时哪个调用将出队。
至少根据 [Wikipedia]( http://en.wikipedia.org/wiki/Chord_(concurrency) ),该结构似乎也存在于Cω语言(以及 Polyphonic 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/